EXAMEN DE BASES DE DATOS 2º.10-6-96 APELLIDOS: NOMBRE: GRUPO: T0 • Rodead con un círculo la respuesta correcta (sólo hay una). • Cada tres cuestiones incorrectamente contestadas anulan una correcta. • NOTA DEL TEST: 3.5 PUNTOS (0.25 POR CUESTIÓN). TIEMPO:60 min Sea el siguiente esquema relacional referente a una agencia de viajes especializada en organizar visitas culturales a distintas ciudades del mundo. La relación viaje contiene la programación actual de viajes, la relación oferta_guía contiene información sobre la disponibilidad de guías especialistas en distintas ciudades indicando su nivel de experiencia, la relación guía contiene los datos personales de los guías con los que trabaja la agencia. CREATE TABLE viaje código dom_código guía dom_agente destino dom_ciudad NOT NULL fecha dom_fecha duración dom_dur PRIMARY KEY (código) FOREIGN KEY (destino, guía) REFERENCES oferta_guía (ciudad,guía) MATCH PARTIAL ON DELETE NO ACTION CREATE TABLE oferta_guía ciudad dom_ciudad guía dom_agente nivel dom_nivel PRIMARY KEY (ciudad, guía) FOREIGN KEY (guía) REFERENCES guía (dni) FOREIGN KEY (ciudad) REFERENCES ciudad (nombre) CREATE TABLE guía dni dom_agente nombre dom_nombre edad dom_edad PRIMARY KEY (dni) ON DELETE CASCADE ON DELETE CASCADE CREATE TABLE ciudad nombre dom_ciudad país dom_país info dom_info PRIMARY KEY (nombre) 1. ¿Cuál es el efecto de la cláusula MATCH PARTIAL en la definición de la relación viaje? a) Prohibe programar un viaje sin conocer quién es el guía responsable del mismo b) Prohibe que se programe un viaje a una ciudad para la cual no se tiene ninguna oferta de guía disponible c) La cláusula es incorrecta ya que el atributo destino tiene restricción de valor no nulo d) Es innecesaria ya que en este caso los tres tipos de integridad referencial coinciden 2. En el esquema anterior ¿cuál sería el comportamiento del SGBD frente al borrado de una tupla de la relación guía? a) Borraría las tuplas de oferta_guía que hacen referencia al guía b) Borraría las tuplas de oferta_guía que hacen referencia al guía y pondría a nulos el valor del atributo guía en aquellas tuplas de viaje en las que se hace referencia a dicho guía c) Si el guía borrado no es referenciado en ninguna tupla de viaje el sistema borraría las tuplas de oferta_guía en las que se hace referencia al guía; si no, el sistema rechazaría la operación. d) Son incompatibles las dos directrices de borrado en las definiciones de viaje y oferta_guía 3. En el esquema anterior ¿cuál sería el efecto de cambiar la cláusula MATCH PARTIAL en la definición de la relación viaje por la cláusula MATCH FULL? a) El efecto sería el mismo ya que el atributo destino tiene restricción de valor no nulo b) No se puede incluir esta cláusula porque el tipo de integridad referencial que representa prohibe que la clave ajena sea parcialmente nula c) Al programar un nuevo viaje habría que registrar como guía responsable del mismo a alguno de los ofertados en la relación oferta_guía para la ciudad de destino del viaje d) Sólo se puede incluir esta cláusula si se elimina la restricción de valor nulo sobre el atributo destino 4. En el esquema anterior ¿qué propiedad representa la siguiente restricción de integridad? CREATE ASSERTION CONSTRAINT programación CHECK (NOT EXISTS (SELECT * FROM guía GX WHERE NOT EXISTS (SELECT * FROM oferta_guía OFX WHERE GX.dni=OFX.guía))) a) Todo guía que aparece en una tupla de la relación oferta_guía debe aparecer también en una tupla de la relación guía b) Todo guía registrado en la relación guía debe aparecer en la base de datos como especialista en alguna ciudad c) Es equivalente a la restricción representada por la definición de la clave ajena en la relación oferta_guía d) Es inconsistente con la definición de la clave ajena en la relación oferta_guía 5. En el esquema anterior ¿qué significaría el siguiente cambio en la definición de la relación viaje? CREATE TABLE viaje código dom_código guía dom_agente destino dom_ciudad NOT NULL fecha dom_fecha duración dom_dur PRIMARY KEY (código) FOREIGN KEY (destino, guía) REFERENCES oferta_guía (ciudad, guía) ON DELETE NO ACTION FOREIGN KEY (destino) REFERENCES ciudad (nombre) ON DELETE CASCADE FOREIGN KEY (guía) REFERENCES guía (dni) ON DELETE SET NULL a) Permitiría programar un nuevo viaje a una ciudad aunque no se tuviese guías disponibles para la misma b) Es equivalente al esquema anterior ya que la definición de las claves ajenas (destino) y (guía) son redundantes con la definición de la clave ajena (destino, guía) c) Es sintácticamente incorrecta porque un mismo atributo no puede formar parte de varias claves ajenas d) Permitiría programar un nuevo viaje a una ciudad con un guía responsable aunque éste no aparezca en oferta_guía como especialista en dicha ciudad 6.- Según el esquema relacional inicial, ¿a qué requerimiento responde la siguiente expresión de álgebra relacional? viaje ((destino, ciudad))) [código] viaje[código] - (oferta_guía a) Códigos de viaje programados en los que el guía responsable no es especialista en la ciudad de destino b) Códigos de viaje programados sin guía c) Códigos de viaje de los que no se conoce ni la ciudad de destino ni el guía responsable d) La concatenación no está definida 7. A qué requerimiento responde la siguiente sentencia SQL: SELECT destino, COUNT(guía) FROM viaje GROUP BY destino a) Obtiene las ciudades para las que se ha programado algún viaje indicando el número de éstos b) Obtiene las ciudades para las que se ha programado algún viaje indicando el número de éstos que tienen asignado guía c) Es sintácticamente incorrecta por el uso de la función COUNT d) Obtiene las ciudades para las que se ha programado algún viaje indicando cuántos guías distintos han sido asignados a ese destino 8. La existencia de restricciones de integridad en una base de datos afecta al SGBD de la siguiente forma: a) El SGBD debe comprobar periódicamente si la base de datos cumple las restricciones de integridad. b) Después de cada modificación de la base de datos, el SGBD debe comprobar si la base de datos cumple todas las restricciones de integridad. c) Según que utilice técnicas curativas o preventivas, deberá comprobar si la base de datos cumple las restricciones de integridad periódicamente o después de cada modificación, respectivamente. d) Después de cada modificación de la base de datos, el SGBD elimina las restricciones que se han violado. 9. Dado el siguiente esquema relacional: A(a0: d_a0, a1: d_a1) CP: {a0} B(b0: d_b0, b1: d_b1) CP: {b0} R(a0: d_a0, b0: d_b0) CP: {a0, b0} CAj: {a0} → A CAj: {b0} → B ¿Cómo se modificaría este esquema para expresar la restricción de que toda tupla de la relación A se debe relacionar con al menos una tupla de la relación B? a) La restricción ya está expresada al definir una clave ajena en R que hace referencia a A. b) Añadiendo a la relación A la siguiente definición: CAj: {a0} → R c) No se puede expresar d) Añadiendo en A un atributo más, llamado b0 10. Dado el siguiente esquema de una base de datos relacional: A(a0 : d_a0, a1 : d_a1) B(a1 : d_a1) ¿Cuál de las siguientes expresiones en álgebra relacional es equivalente a la expresión A ÷ B? B) [a0] a) A[a0]- (A b) A[a0]- ((A B)-A) [a0] c) A × (A- B) [a0] d) A[a0]- ((A[a0] × B)-A) [a0] 11. ¿Cuál de las siguientes afirmaciones es cierta? a) Los atributos que constituyen la clave primaria de una relación no pueden tener valor nulo b) Los atributos que constituyen una clave alternativa de una relación no pueden tener valor nulo, identifican unívocamente a las tuplas de la relación y tienen la propiedad de minimalidad c) La clave ajena de una relación debe cumplir la restricción de integridad referencial y no puede tomar valor nulo d) Una clave candidata de una relación, si no es la clave primaria, puede tomar valores sin restricciones 12. Una fórmula abierta de cálculo relacional de tuplas se evalúa a) Como si las variables ligadas estuvieran cuantificadas existencialmente. b) Comprobando si existe al menos un valor para cada variable libre que haga cierta la fórmula c) Como si las variables libres estuvieran cuantificadas universalmente d) Asignando sucesivamente todos los valores posibles a cada variable libre y evaluando las fórmulas cerradas así obtenidas 13. Las definiciones en DDL de Ingres siguientes: CREATE PROCEDURE p1(x=integer) AS DECLARE aux=integer; BEGIN SELECT MAX(a1) INTO aux FROM A; IF aux=x THEN INSERT INTO B VALUES (y) ENDIF END; CREATE RULE r1 AFTER INSERT,UPDATE(a1) INTO A EXECUTE PROCEDURE p1(x=new.a1, y=new.a0) son necesarias para controlar una de las restricciones de integridad siguientes. ¿Cuál? a) Por cada tupla de A que se añada o se modifique debe insertarse una tupla en B que contenga el valor del atributo modificado. b) Ninguna, porque no se puede insertar en una relación desde un procedimiento. c) Cuando se introduzca un nuevo valor en el atributo a1 de la relación A, si no hay ningún valor mayor que él en el mismo atributo, debe insertarse una tupla en B que contenga el valor del atributo a0 de la tupla insertada o modificada en A. d) Por cada tupla de A que se añada o se modifique debe insertarse una tupla en B que contenga el valor del atributo a0 de la tupla insertada o modificada en A. 14. Dada la siguiente definición de relación: Emp(dni: entero, nombre: tira(40)) CP: {dni} y la siguiente expresión del cálculo relacional de tuplas: X: Emp { X.nombre | ¬ Emp(X) } ¿Cuál es la sentencia SQL/92 equivalente a dicha expresión? a) SELECT nombre FROM Emp b) SELECT nombre FROM Emp WHERE NOT EXISTS(SELECT * FROM Emp) c) No existe una expresión equivalente. d) La expresión en cálculo relacional de tuplas es sintácticamente incorrecta. BASES DE BASES DE DATOS 2º. TIEMPO: 3 ½h La Universidad Politécnica de Valencia organiza anualmente una “Escola d´Estiu” para los hijos de los trabajadores y alumnos; con el fin de facilitar la organización de los grupos de niños por edades, la asignación de monitores a dichos grupos y la planificación de las actividades que realizarán éstos, se ha diseñado una base de datos relacional cuyo esquema es el siguiente: NIÑO(cod_niño: dom_niño, nombre: dom_nom, edad: dom_edad, cod_gru1: dom_gru) CP: {cod_niño} CAj: {cod_gru} referencia GRUPO VNN: {cod_gru} MONITOR(dni: dom_dni, nombre: dom_nom, edad: dom_edad, especialidad2: dom_esp) CP: {dni} ACTIVIDAD(cod_act: dom_act, objetivos: dom_obj, responsable3:dom_dni, tiempo4:d_tiempo) CP: {cod_act} CAj: {responsable} → MONITOR VNN: {responsable} GRUPO(cod_gru: dom_gru, edad_max5: dom_edad, color6: dom_color) CP: {cod_gru} PARTICIPA7(cod_gru: dom_gru, cod_act: dom_act, fecha: dom_fecha) CP: {cod_gru, cod_act} CAj: {cod_gru} → GRUPO CAj: {cod_act} → ACTIVIDAD VNN: {fecha} SE_OCUPA8(dni: dom_dni, cod_gru: dom_gru) CP: {dni, cod_gru} CAj: {cod_gru} → GRUPO CAj: {dni} → MONITOR 1. Escribir una expresión en cálculo relacional de tuplas para controlar la siguiente restricción de integridad: “un monitor no puede ocuparse de grupos cuya edad máxima supere la suya”(1 punto) 2. Obtener el código y el color de la camiseta de aquellos grupos que participan en todas las actividades cuyo responsable tiene por nombre ‘José Pericás’.(Álgebra Relacional) (1 punto) 3. Obtener el código y la edad máxima de aquellos grupos que sólo participan en actividades cuyos responsables son monitores que se ocupan del grupo. (SQL) (1,5 puntos) 4. ¿Quiénes son los monitores que se ocupan de más de cincuenta niños y que son responsables de más de tres actividades? (SQL) (1,5 puntos) 5. Escribir las reglas y procedimientos (con el DDL del Ingres) que sean necesarios para controlar en el sistema la siguiente restricción de integridad: “Los grupos con más de veinte niños no pueden participar en actividades cuya duración supere las cuatro horas” (1,5 puntos) 1 cod_gru = grupo al que pertenece el niño especialidad = natación, música, … 3 responsable = monitor encargado de la actividad 4 tiempo = duración aproximada de la actividad 5 edad_max = edad máxima aconsejada para formar parte del grupo 6 color = color de la camiseta que deben llevar los niños que forman parte del grupo 7 Esta relación expresa cuándo un grupo participa en una determinada actividad 8 Esta relación expresa qué monitores se ocupan de cada grupo 2 SOLUCIONES UNO. GX : GRUPO; MX : MONITOR; OX: SE_OCUPA; ∀ OX (SE_OCUPA(OX) → ∃ MX (MONITOR(MX) ∧ OX.dni = MX.dni ∧ ∃ GX (GRUPO(GX) ∧ OX.cod_gru = GX.cod_gru ∧ GX.edad_max ≤ MX.edad)) DOS. ((PARTICIPA [cod_gru, cod_act] ÷ (MONITOR ACTIVIDAD (responsable, dni)) donde nombre = “José Pericás” [cod_act] ) GRUPO) [cod_gru, color] TRES. SELECT GX.cod_gru, GX.edad_max FROM GRUPO GX WHERE NOT EXISTS ( SELECT * FROM PARTICIPA PX WHERE PX.cod_gru = GX.cod_gru AND NOT EXISTS ( SELECT * FROM ACTIVIDAD AX, SE_OCUPA OX WHERE AX.cod_act = PX.cod_act AND AX.responsable = OX.dni AND OX.cod_gru = GX.cod_grupo)) CUATRO. SELECT MX.dni, MX.nombre FROM MONITOR MX WHERE MX.dni IN ( SELECT OX.dni FROM SE_OCUPA OX, NIÑO NX WHERE OX.num_gru = NX.num_gru GROUP BY OX.dni HAVING COUNT(*) > 50) AND MX.dni IN ( SELECT AX.responsable FROM ACTIVIDAD AX GROUP BY AX.responsable HAVING COUNT(*) > 3); CINCO. CREATE PROCEDURE modif_participa (grupo = char(10), activ = char(10=) AS DECLARE num_niños = integer; duracion = real; BEGIN /* num_niños = número de niños que hay en el grupo */ SELECT COUNT(*) INTO num_niños FROM NIÑO WHERE cod_gru = grupo; /* duracion = duracion de la actividad */ SELECT AX.tiempo INTO duracion FROM ACTIVIDAD AX WHERE AX.cod_act = activ; IF num_niños > 20 AND duracion > 4 THEN RAISE ERROR 1 ‘Los grupos con más de 20 niños no pueden participar en actividades cuya duración supere las 4 horas’; ENDIF; END; CREATE RULE modif_participa AFTER INSERT, UPDATE ON PARTICIPA EXECUTE PROCEDURE modif_participa (grupo=NEW.cod_gru, activ=NEW.cod_act); CREATE PROCEDURE modif_grupo (grupo = char(10)) AS DECLARE num_niños = integer; num_activ = integer; BEGIN /* num_niños = número de niños que hay en el grupo */ SELECT COUNT(*) INTO num_niños FROM NIÑO WHERE cod_gru = grupo; /* num_activ = número de actividades de más de 4 horas en las que participa el grupo */ SELECT COUNT(*) INTO num_activ FROM PARTICIPA PX, ACTIVIDAD AX WHERE PX.cod_gru = grupo AND PX.cod_act = AX.cod_act AND AX.tiempo > 4; IF num_niños > 20 AND num_activ > 0 THEN RAISE ERROR 1 ‘No puede incluirse el niño en el grupo, porque éste participa en actividades de más de 4 horas y llegaría a tener más de 20 niños’; ENDIF; END; CREATE RULE modif_grupo AFTER INSERT, UPDATE(cod_grupo) ON NIÑO EXECUTE PROCEDURE modif_grupo (grupo=NEW.cod_gru); CREATE PROCEDURE modif_actividad (activ = char(10) ) AS DECLARE num_grupos = integer; BEGIN /* num_grupos = número de grupos que tienen más de 20 niños y que participan en la actividad */ SELECT COUNT(*) INTO num_grupos FROM GRUPO WHERE cod_gru IN ( SELECT PX.cod_gru FROM PARTICIPA PX, NIÑO NX WHERE PX.cod_act = activ AND PX.cod_gru = NX.cod_gru GROUP BY PX.cod_gru HAVING COUNT(*) > 20); IF num_grupos > 0 THEN RAISE ERROR 1 ‘La duración de la actividad no puede ser mayor de 4 horas porque participan en ella grupos de más de 20 niños’; ENDIF; END; CREATE RULE modif_actividad AFTER UPDATE(tiempo) ON ACTIVIDAD WHERE NEW.tiempo > 4 EXECUTE PROCEDURE modif_actividad (activ=OLD.cod_act);