↩️ [[Public/Teaching/Unisabana/BBDD/BBDD-GuiasPracticas/index|index]] # Guía 04.8 - Ejercicio pre-parcial # Ejercicio de evaluación segundo parcial: Ingeniería de BBDD - Caso "PetHealth" **Asignatura:** Bases de Datos **Facultad de Ingeniería** **Puntaje Total:** 20 Puntos ## 📑 Introducción al Reto La clínica veterinaria "PetHealth" ha intentado migrar su sistema de archivos Excel a una base de datos relacional en MariaDB. Sin embargo, el equipo de desarrollo junior dejó el código con múltiples errores de integridad, sintaxis y lógica. **Tu misión:** Como Ingeniero de Datos, debes depurar el código, completar las instrucciones faltantes y asegurar que la base de datos sea capaz de generar reportes estratégicos para la gerencia. ## 🛠️ FASE 1: Diseño Físico y Estructura (DDL) — [6 Puntos] ### Acción 1: Creación del Esquema El siguiente script tiene errores intencionales. El motor de base de datos rechazará la ejecución debido a problemas en el orden de las tablas y errores en las llaves foráneas. #### Ejercicio 1: Depuración del Esquema (4 Puntos) **Instrucción:** Identifica los 3 errores técnicos que impiden que este script se ejecute correctamente en MariaDB. Corrige el código y ejecútalo. ``` SQL -- ERROR SEMBRADO: ¿Se puede crear una tabla que referencia a otra que aún no existe? CREATE DATABASE IF NOT EXISTS veterinaria_db; USE veterinaria_db; CREATE TABLE Mascota ( id_mascota INT AUTO_INCREMENT PRIMARY KEY, nombre VARCHAR(50) NOT NULL, especie VARCHAR(30), id_propietario INT, CONSTRAINT fk_mascota_propietario FOREIGN KEY (id_propietario) REFERENCES Propietario(id_propietario) ); CREATE TABLE Propietario ( id_propietario INT AUTO_INCREMENT PRIMARY KEY, nombre VARCHAR(100) NOT NULL, correo VARCHAR(100) ); -- ERROR DE SINTAXIS: Falta una coma o tipo de dato incorrecto CREATE TABLE Cita ( id_cita INT PRIMARY KEY AUTO_INCREMENT fecha_cita DATETIME NOT NULL, motivo TEXT id_mascota INT, FOREIGN KEY id_mascota REFERENCES Mascota(id_mascota) ); ``` Aquí tu respuesta a las preguntas: ``` Respuesta en texto ``` Aquí tu código corregido: ``` SQL Código corregido ``` #### Ejercicio 2: Restricciones de Integridad (2 Puntos) **Instrucción:** Modifica la tabla `Mascota` para asegurar que la edad sea siempre un valor positivo (usando `CHECK`) y que el correo del `Propietario` sea único (usando `UNIQUE`). Escribe las sentencias `ALTER TABLE` correspondientes. Aquí tu código : ``` SQL Aquí tu código ``` ## 💾 FASE 2: Manipulación y Mantenimiento (DML) — [5 Puntos] ### Acción 2: Población de Datos El dueño de la clínica quiere insertar los siguientes registros, pero algunos violarán las reglas de integridad que acabas de crear. #### Ejercicio 3: Diagnóstico de Inserción (3 Puntos) **Instrucción:** Sin ejecutar el código aún, interpreta qué filas darán error y justifica por qué (basado en PK, FK o restricciones). ``` SQL -- Registro A INSERT INTO Propietario (nombre, correo) VALUES ('Ana Rojas', '[email protected]'); -- Registro B INSERT INTO Propietario (nombre, correo) VALUES ('Luis Perez', '[email protected]'); -- Registro C INSERT INTO Mascota (nombre, especie, id_propietario) VALUES ('Firulais', 'Perro', 99); ``` Aquí tu respuesta a la/s preguntas: ``` Respuesta en texto ``` #### Ejercicio 4: Mantenimiento de Datos (2 Puntos) **Instrucción:** Escribe una sentencia `UPDATE` para cambiar el motivo de todas las citas del día "2025-04-14" a "Consulta General de Prevención". Aquí tu código : ``` SQL Aquí tu código ``` ## 📈 FASE 3: Consultas de Negocio e Inteligencia (SELECT) — [7 Puntos] ### Acción 3: Extracción de Valor La gerencia necesita reportes claros para la toma de decisiones. #### Ejercicio 5: Relaciones Cruzadas (JOINs) (4 Puntos) **Instrucción:** Completa la siguiente consulta para obtener un listado que muestre: **Nombre del Propietario**, **Nombre de la Mascota** y **Fecha de su Cita**. Usa alias para las tablas. ``` SQL SELECT ____.nombre AS Dueño, ____.nombre AS Paciente, ____.fecha_cita FROM Propietario ____ JOIN Mascota ____ ON ____.id_propietario = ____.id_propietario ____ Cita ____ ON ____.id_mascota = ____.id_mascota; ``` Aquí tu código : ``` SQL Aquí tu código ``` #### Ejercicio 6: Agrupación Avanzada (3 Puntos) **Instrucción:** "Queremos saber cuántas mascotas tiene cada propietario, pero solo mostrar a aquellos que tienen más de 2 mascotas". Completa la instrucción con `GROUP BY` y `HAVING`. Aquí tu código : ``` SQL Aquí tu código ``` ## 🔌 FASE 4: Conectividad y Seguridad (PHP/PDO) — [2 Puntos] ### Acción 4: Seguridad del Backend El siguiente script de PHP es vulnerable a **Inyección SQL**. #### Ejercicio 7: Depuración de Conexión (2 Puntos) **Instrucción:** Identifica por qué el siguiente código es inseguro y reescríbelo usando **Sentencias Preparadas (PDO)**. ``` php // CÓDIGO INSEGURO $id = $_GET['id']; $sql = "SELECT * FROM Mascota WHERE id_mascota = " . $id; $resultado = $pdo->query($sql); ``` Aquí tu código : ``` SQL Aquí tu código ``` ## 🏁 Criterios de Entrega 1. **Script Final:** Un archivo `.sql` que se ejecute de principio a fin sin errores. 2. **Análisis:** Un documento Markdown con las capturas de pantalla de los resultados de las consultas (Ejercicios 5 y 6) y la justificación técnica de las correcciones realizadas. ↩️ [[Public/Teaching/Unisabana/BBDD/BBDD-GuiasPracticas/index|index]]