GRUPO

Anuncio
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);
Descargar