Tema II: El modelo relacional de datos.

Anuncio
Tema II:
El modelo relacional
de datos.
(2.7)
El modelo relacional de datos.
9 2.5 El lenguaje standard SQL
– 2.5.1 Lenguaje de definición de datos DDL.
– 2.5.2 Lenguaje de manipulación de datos DML.
9 2.6 Información derivada: vistas
– 2.6.1 Concepto de vista.
– 2.6.2 Aplicaciones de las vistas
– 2.6.3 Vistas en SQL.
9 2.7 Mecanismos de actividad: disparadores
– 2.7.1 Concepto de disparador
– 2.7.2 Reglas Evento-Condición-Acción
– 2.7.3 Disparadores en SQL
– 2.7.4 Aplicaciones de los disparadores
2.8 Evolución del modelo relacional
1
2.7.1. Disparadores. Concepto
Evolución en el tiempo de una base de datos
9Operaciones interactivas (Usuario)
9Cambios automáticos (Programas):
-Sistemas activos
Muchas veces nos interesa que esta evaluación
responda a ciertos eventos o situaciones.
Reservas
Ejemplo
Area de deportes:
Reserva de las pistas
deportivas e instalaciones y
Sanciones por mal uso
Sanción
pista
fecha
hora
dni
confirmada
dni
fecha
2.7.1. Disparadores. Concepto
Automatización
Gestión del uso de las pistas reservadas: cada usuario después de usar
una pista reservada debe validar su uso, introduciendo sus datos y los de la
pista desde una terminal
cada
Cadadía
díaa a
las
las24
24h.h.
si existen pistas del día
no confirmadas
sancionar a los
usuarios responsables
cuándo
en qué condiciones
qué se debe hacer
Gestión de reservas: un usuario sancionado no puede reservar pistas hasta
que no venza su sanción
Al solicitar
una reserva
Si el usuario está
sancionado
cuándo
en qué condiciones
Rechazar la reserva
qué se debe hacer
2
2.7.1. Disparadores. Concepto
Automatización
Gestión de sanciones: un usuario sancionado al que le vence la sanción
debe ser liberado de ella.
cada
Cada
díadía
a a
laslas
2424
h. h.
cuándo
si existen sanciones
que vencen en el día
borrar las sanciones
vencidas
en qué condiciones
qué se debe hacer
2.7.1. Disparadores. Concepto
Histórico de Profesores: Siempre que se dé de baja a un profesor sus datos
deben grabarse en un histórico de profesores
HistóricoProfesores
Profesor
codigo
Borrado
codigo
nombre
nombre
Teléfono
teléfono
categoria
dep
dep
Inserción
categoria
fecha
SGBD
cuándo
qué hacer
¿quién debe
realizar esta
inserción?: SGBD
3
2.7.1. Disparadores. Concepto
9SGBD activo: ejecuta acciones como respuesta
a la ocurrencia de un evento o de una situación
9Comportamiento activo del sistema se modela
en el esquema de la BD mediante :
- Reglas de actividad o disparadores
9 Un disparador es una regla en la que se
especifica una acción que el SGBD debe
ejecutar como respuesta a la ocurrencia de un
evento, siempre que se cumpla la condición
especificada.
El modelo relacional de datos.
9 2.5 El lenguaje standard SQL
– 2.5.1 Lenguaje de definición de datos DDL.
– 2.5.2 Lenguaje de manipulación de datos DML.
9 2.6 Información derivada: vistas
– 2.6.1 Concepto de vista.
– 2.6.2 Aplicaciones de las vistas
– 2.6.3 Vistas en SQL.
9 2.7 Mecanismos de actividad: disparadores
– 2.7.1 Concepto de disparador
– 2.7.2 Reglas Evento-Condición-Acción
– 2.7.3 Disparadores en SQL
– 2.7.4 Aplicaciones de los disparadores
2.8 Evolución del modelo relacional
4
2.7.2. Disparadores. Evento-Condición-Acción
Disparadores: EVENTO - CONDICIÓN - ACCION
9Evento: suceso a cuya ocurrencia debe
responder el sistema
9Condición: Contexto en el cual la regla debe
ejecutarse
9Acción: lo que debe hacer el disparador:
cada día a
las 24 h.
si existen pistas del día
no confirmadas
sancionar a los
usuarios responsables
EVENTO
CONDICIÓN
ACCIÓN
2.7.2. Disparadores. Evento-Condición-Acción
Funciones de un sistema activo
9Activación: El sistema activa una regla cuando
su evento ocurre
9Evaluación: Tras la activación se evalúa la
condición.
9Ejecución: Tras la evaluación se ejecutan las
acciones de los disparadores cuya condición es
cierta.
5
2.7.2. Disparadores. Evento-Condición-Acción
Elementos de un sistema activo
9Sintaxis: Se expresa lo que se puede incluir en
cada componente de un disparador.
- Evento
- Condición
- Acción
9Semántica: Se expresa como son procesados
por el sistema los disparadores.
- Acoplo
- Granularidad
- Procesamiento
- Conflictos
2.7.2. Disparadores. Evento-Condición-Acción
Sintaxis
9Evento:
- Actualizaciones de la BD.
- Operaciones de Consulta
- Eventos temporales
- Por aplicaciones
9Condición: es una expresión de tipo lógico o una
llamada a una función de tipo lógico desde algún
lenguaje de programación.
9Acción:
- Operaciones de actualización de la BD.
- Operaciones de Consulta
- Transacciones
- Control de errores
- Funciones en algún lenguaje
6
2.7.2. Disparadores. Evento-Condición-Acción
Sintaxis de los disparadores
cada
Cadadía
díaa a
las
las24
24h.h.
si existen pistas del día
no confirmadas
sancionar a los
usuarios responsables
cuándo
en qué condiciones
qué se debe hacer
Condición lógica
Actualizacion de la BD:
Insertar una sanción
Evento Temporal
cada
Cada
díadía
a a
laslas
2424
h. h.
cuándo
Evento Temporal
si existen sanciones
que vencen en el día
borrar las sanciones
vencidas
en qué condiciones
qué se debe hacer
Condición lógica
Actualizacion de la BD:
Borrar una sanción
2.7.2. Disparadores. Evento-Condición-Acción
Semántica de ejecución
Son diferentes las ejecuciones en los sistemas, según:
9Acoplo: entre la ocurrencia y la evaluación y
entre la evaluación y la ejecución
- inmediato / diferido
9Granularidad: Tratamiento de actualizaciones
multiples:
- Orientada a tupla / a Conjunto
9Procesamiento: disparadores sobre otros
- Iterativo / Recursivo
9Conflictos: Orden de ejecución
- Fecha / Aleatorio / Especificado
7
2.7.2. Disparadores. Evento-Condición-Acción
Histórico de Profesores: Siempre que se dé de baja a un profesor sus datos
deben grabarse en un histórico de profesores
HistóricoProfesores
Profesor
codigo
Borrado
codigo
nombre
nombre
Teléfono
teléfono
categoria
dep
dep
Inserción
categoria
fecha
SGBD
cuándo
qué hacer
¿quién debe
realizar esta
inserción?: SGBD
Interesa Granularidad orientada a la tupla
El modelo relacional de datos. AQUIIIIIIII PAG193
9 2.5 El lenguaje standard SQL
– 2.5.1 Lenguaje de definición de datos DDL.
– 2.5.2 Lenguaje de manipulación de datos DML.
9 2.6 Información derivada: vistas
– 2.6.1 Concepto de vista.
– 2.6.2 Aplicaciones de las vistas
– 2.6.3 Vistas en SQL.
9 2.7 Mecanismos de actividad: disparadores
– 2.7.1 Concepto de disparador
– 2.7.2 Reglas Evento-Condición-Acción
– 2.7.3 Disparadores en SQL
– 2.7.4 Aplicaciones de los disparadores
2.8 Evolución del modelo relacional
8
2.7.3. Disparadores. En SQL.
CREATE TRIGGER nombre_disparador
{BEFORE | AFTER } Cuando se ejecuta
{INSERT | DELETE | UPDATE [OF atributo1, atributo2,
…, atributon]} ON nombre_relación
Evento
[REFERENCING {OLD [ROW ] [AS ] nombre_referencia
Parametros
de tupla
|NEW[ROW][AS] nombre_referencia
| OLD_TABLE [AS ] nombre_referencia
Parametros
de tabla
| NEW_TABLE [AS ] nombre_referencia
}]
[FOR EACH {ROW | STATEMENT} ] Granularidad
[WHEN ( condición ) ] Condición: SQL
{sentencia_SQL | bloque SQL/PSM | CALL procedi_SQL}
Acción
2.7.3. Disparadores. En SQL.
EVENTOS
{BEFORE | AFTER | INSTEAD OF} evento
[disyunción_eventos]
ON {nombre_relación | nombre_vista}
disyunción_eventos
[disyunción_eventos]
::=
evento ::=
INSERT |
DELETE |
comalista_nombre_atributo]
OR
evento
UPDATE [OF
9
2.7.3. Disparadores. En SQL.
EVENTOS
El evento de un disparador en SQL sólo puede
ser una única operación de actualización sobre
una relación básica de la BD.
Esta implícitamente parametrizado :
– Parámetros tupla
– Parámetros de tabla
Estos parámetros se pueden usar en la
CONDICIÓN y en la ACCIÓN
2.7.3. Disparadores. En SQL.
EVENTOS
Parámetros de tabla:
– OLD_TABLE
– NEW_TABLE
Parámetros de tupla
– OLD ROW
– NEW ROW
Si el evento es una operación INSERT sólo
están definidos los parámetros NEW.
Si es un DELETE sólo los OLD
En las modificaciones AMBOS
10
2.7.3. Disparadores. En SQL.
FOR EACH STATEMENT
BEFORE
AFTER
La regla se ejecuta una vez
antes de la ejecución de la
operación de actualización
La regla se ejecuta una vez
después de la ejecución de
la operación de actualización
FOR EACH ROW
La regla se ejecuta una vez
antes de actualización de
cada tupla afectada por la
operación de actualización
La regla se ejecuta una vez
después de actualización
de cada tupla afectada por
la operación de
actualización
2.7.3. Disparadores. En SQL.
CONDICIONES
WHEN (condición)
– expresión lógica de sintaxis similar a la condición
de la cláusula WHERE de la instrucción SELECT
– no puede contener subconsultas ni funciones
agregadas
– sólo se puede hacer referencia a los parámetros
del evento
11
2.7.3. Disparadores. En SQL.
ACCIONES
bloque PL/SQL
– bloque escrito en el lenguaje de programación de
Oracle PL/SQL
– sentencias de manipulación de la BD: INSERT,
DELETE, UPDATE, SELECT ... INTO ...
– sentencias de programa: asignación, selección,
iteración
– sentencias de manejo de errores
– sentencias de entrada/salida
– Llamada a procedimiento escrito en SQL/PSM u
otro lenguaje de programación
2.7.3. Disparadores. En SQL.
GRANULARIDAD
Hace referencia a la forma en que son tratadas las
tuplas afectadas por el evento cuando estas son
varias.
Existen dos tipos:
– Orientada a la tupla (FOR EACH ROW). Puede
usar los parámetros de tupla y de tabla (estos
últimos no cambian durante la ejecución)
– Orientada al conjunto de tuplas (FOR EACH
STATEMENT)<- por defecto. (Sólo puede usar los
parámetros de tabla.
12
2.7.3. Disparadores. En SQL.
PUNTO DE EJECUCIÓN DEL DISPARADOR
Cuando un disparador activado es seleccionado por
el sistema para su ejecución el diseñador puede
seleccionar si:
– El disparador se procesa antes (BEFORE)
– O después (AFTER) de la ejecución del evento.
2.7.3. Disparadores. En SQL
Ejemplo
Gestión de reservas: El disparador que rechazaría el intento de reservar una
pista por parte de un usuario sancionado
CREATE TRIGGER Control_reservas
Evento BEFORE INSERT ON Reservas
REFERENCING NEW ROW AS nueva_reserva
FOR EACH ROW Granularidad
WHEN nueva_reserva.dni IN
Condición
(SELECT dni FROM Sanción)
BEGIN ATOMIC
SIGNAL Reserva_rechazada Acción
END
13
2.7.3. Disparadores. En SQL.
Histórico de Profesores: Siempre que se dé de baja a un profesor sus datos
deben grabarse en un histórico de profesores
HistóricoProfesores
Profesor
codigo
Condición no existe
codigo
nombre
nombre
Teléfono
teléfono
dep
categoria
Borrado
dep
Inserción
categoria
fecha
SGBD
¿quién debe
realizar esta
inserción?: SGBD
CREATE TRIGGER Baja_Profesor
AFTER DELETE ON Profesor Evento
REFERENCING OLD ROW AS viejo
FOR EACH ROW Granularidad
BEGIN ATOMIC
INSERT INTO Historico (codigo, nombre,
teléfono, categoría, dep, fecha) Acción
VALUES (viejo.codigo, viejo.nombre, viejo.tel,
viejo.categoria, viejo.dep, SYSDATE)
END
cuándo
qué hacer
El modelo relacional de datos.
9 2.5 El lenguaje standard SQL
– 2.5.1 Lenguaje de definición de datos DDL.
– 2.5.2 Lenguaje de manipulación de datos DML.
9 2.6 Información derivada: vistas
– 2.6.1 Concepto de vista.
– 2.6.2 Aplicaciones de las vistas
– 2.6.3 Vistas en SQL.
9 2.7 Mecanismos de actividad: disparadores
– 2.7.1 Concepto de disparador
– 2.7.2 Reglas Evento-Condición-Acción
– 2.7.3 Disparadores en SQL
– 2.7.4 Aplicaciones de los disparadores
2.8 Evolución del modelo relacional
14
2.7.4. Disparadores. Aplicaciones
Son muchas las aplicaciones:
9Comprobación de la integridad
9Restauración de la consistencia
9Mantenimiento de datos derivados
- Cálculos complejos
- Cálculos derivados muy habituales
9Reglas de funcionamiento de la organización
2.7.4. Disparadores. Aplicaciones
Comprobación de integridad
Los profesores que imparten la asignatura de código EST1 deben ser del
departamento de Estadística (EST)
CREATE ASSERTION docencia_EST1
CHECK (NOT EXISTS
(SELECT * FROM Docencia JOIN Profesor
ON (codigo=cod_pro)
WHERE Profesor.cod_dep<>”EST” AND
Docencia.cod_asg=”EST1”) )
Si no existen estas RI en nuestro SGBD ==> Disparadores
15
2.7.4. Disparadores. Aplicaciones
Comprobación de integridad
Los profesores que imparten la asignatura de código EST1 deben ser del
departamento de Estadística (EST). (Actualizaciones sobre Docencia)
Disparadores sobre Docencia:
INSERT
Docencia
UPDATE (cod_asg)
NEW.cod_asg=EST1
si dep de
NEW.cod_pro <>”EST”
entonces RECHAZAR
UPDATE (cod_pro)
Evento
Condición
Acción
2.7.4. Disparadores. Aplicaciones
Comprobación de integridad
Los profesores que imparten la asignatura de código EST1 deben ser del
departamento de Estadística (EST). (Actualizaciones sobre Docencia)
CREATE TRIGGER RI_docencia1_EST1
AFTER INSERT ON Docencia
REFERENCING NEW ROW AS nueva
FOR EACH ROW
WHEN nueva.cod_asg = ‘EST1’
BEGIN ATOMIC
DECLARE X CHAR(5);
SELECT P.dpto INTO X FROM Profesor P
WHERE P.código = :nueva.cod_pro;
IF X <> ‘EST’ THEN SIGNAL ERROR_EST1 ENDIF;
END
16
CREATE TRIGGER RI_docencia2_EST1
AFTER UPDATE OF cod_pro, cod_asg ON Docencia
REFERENCING NEW ROW AS nueva
FOR EACH ROW
WHEN nueva.cod_asg = ‘EST1’
BEGIN ATOMIC
DECLARE X CHAR(5);
SELECT P.dpto INTO X FROM Profesor P
WHERE P.código = :nueva.cod_pro;
IF X <> ‘EST’ THEN SIGNAL ERROR_EST1 ENDIF;
END
2.7.4. Disparadores. Aplicaciones
Comprobación de integridad
Los profesores que imparten la asignatura de código EST1 deben ser del
departamento de Estadística (EST). (Actualizaciones sobre Profesor)
Disparadores sobre Profesor:
Profesor
UPDATE (dep)
OLD.dep=EST
AND
NEW.dep<>EST
Evento
Condición
si NEW.codigo
imparte EST1
entonces RECHAZAR
Acción
17
2.7.4. Disparadores. Aplicaciones
Comprobación de integridad
Los profesores que imparten la asignatura de código EST1 deben ser del
departamento de Estadística (EST). (Actualizaciones sobre Profesor)
CREATE TRIGGER RI_docencia3_EST1
BEFORE UPDATE OF dpto ON Profesor
REFERENCING OLD ROW AS viejo
REFERENCING NEW ROW AS nuevo
FOR EACH ROW
WHEN viejo.dpto = ‘EST’ AND nuevo.dpto <> ‘EST’
BEGIN ATOMIC
DECLARE X INTEGER;
SELECT COUNT(*) INTO X FROM Docencia D
WHERE D.cod_pro = :nuevo.código AND D.cod_asg=‘EST1’
IF X <> 0 THEN SIGNAL ERROR_EST1 ENDIF;
END
2.7.4. Disparadores. Aplicaciones
Mantenimiento de datos derivados
9Vistas son información derivada
- Gran coste para consultas complejas
9Cálculos complejos
9Cálculos derivados muy habituales
9Mantenimiento manual: fallos e inconsistencias
18
2.7.4. Disparadores. Aplicaciones
Mantenimiento de datos derivados
Consulta frecuente: solicitar los datos del profesor y entre ellos el total de
créditos que imparte
SELECT PX.codigo, PX.nombre,
SUM (DX.gteo*AX.teo + DX.gprac*AX.prac)
FROM Profesor PX, Docencia DX, Asignatura AX
WHERE PX.codigo=DX.cod_pro AND
DX.cod_asg=AX.codigo
GROUP BY PX.codigo, PX.nombre
Añadir columna nueva a la tabla Profesor: créditos
2.7.4. Disparadores. Aplicaciones
Mantenimiento de datos derivados
Consulta frecuente: solicitar los datos del profesor y entre ellos el total de
créditos que imparte
aplicar la ley de derivación del
atributo créditos en Profesor y
actualizar dicho atributo:
INSERT
Docencia
Profesor
UPDATE (gteo, gprac)
UPDATE (créditos)
DELETE
código
nombre
Teléfono
UPDATE (cod_pro,cod_asg)
categoria
dep
créditos
Evento
Condición
Acción
19
2.7.4. Disparadores. Aplicaciones
Mantenimiento de datos derivados
Consulta frecuente: solicitar los datos del profesor y entre ellos el total de
créditos que imparte
CREATE TRIGGER total_creditos1
AFTER INSERT ON Docencia
REFERENCING NEW ROW AS nuevo
FOR EACH ROW
BEGIN ATOMIC
DECLARE vteo, vprac DECIMAL(1,1);
SELECT teo, prac INTO vteo, vprac
FROM Asignatura
WHERE código = : nuevo.cod_asg;
UPDATE Profesor
SET créditos=créditos+(:nuevo.gteo*vteo + :nuevo.gpra*vprac)
WHERE código=:nuevo.cod_pro;
END
2.7.4. Disparadores. Aplicaciones
Mantenimiento de datos derivados
Consulta frecuente: solicitar los datos del profesor y entre ellos el total de
créditos que imparte
CREATE TRIGGER total_creditos2
AFTER DELETE ON Docencia
REFERENCING OLD ROW AS viejo
FOR EACH ROW
BEGIN ATOMIC
DECLARE vteo, vprac DECIMAL(1,1);
SELECT teo, prac INTO vteo, vprac
FROM Asignatura
WHERE código = : viejo.cod_asg;
UPDATE Profesor
SET créditos=créditos-(:viejo.gteo*vteo + :viejo.gpra*vprac)
WHERE código=:viejo.cod_pro;
END
20
2.7.4. Disparadores. Aplicaciones
CREATE TRIGGER total_creditos3
AFTER UPDATE OF gteo, gprac ON Docencia
REFERENCING OLD ROW AS viejo
REFERENCING NEW ROW AS nuevo
FOR EACH ROW
WHEN (viejo.cod_pro = nuevo.cod_pro
AND viejo.cod_asg = nuevo.cod_asg)
BEGIN ATOMIC
DECLARE vteo, vprac DECIMAL (1,1);
SELECT teo, prac INTO vteo, vprac
FROM Asignatura
WHERE código= :viejo.cod_asg;
UPDATE Profesor
SET créditos = créditos
- (:viejo.gteo*vteo + :viejo.gpra*vprac)
+ (:nuevo.gteo*vteo + :nuevo.gpra*vprac)
WHERE código=:viejo.cod_pro;
END
2.7.4. Disparadores. Aplicaciones
Mantenimiento de datos derivados
Consulta frecuente: solicitar los datos del profesor y entre ellos el total de
créditos que imparte
CREATE TRIGGER total_creditos4
AFTER UPDATE OF cod_pro, cod_asg ON Docencia
REFERENCING ...
CREATE TRIGGER total_creditos5
AFTER UPDATE OF teo, prac ON Asignatura
REFERENCING ...
21
2.7.4. Disparadores. Aplicaciones
Mantenimiento de datos derivados
Consulta frecuente: solicitar los datos del profesor y entre ellos el total de
créditos que imparte
aplicar la ley de derivación del
atributo créditos en Profesor y
actualizar dicho atributo:
Asignatura
Profesor
UPDATE (teo, prac)
UPDATE (créditos)
código
nombre
Teléfono
categoria
dep
créditos
Evento
Condición
Acción
2.7.4. Disparadores. Aplicaciones
Mantenimiento de datos derivados
Consulta frecuente: solicitar los datos del profesor y entre ellos el total de
créditos que imparte
CREATE TRIGGER total_creditos5
AFTER UPDATE OF teo, prac ON ASIGNATURTA
REFERENCING ...
22
MÁS EJEMPLOS DE DISPARADORES
Más ejemplos
La restricción R2 :
R2) Px: Pieza, Sx: Suministro ∀Px : Pieza (∃Sx : Suministro (
Sx.código=Px.código ) )
se define mediante una restricción general:
create assertion R2 check
not exists(select * from Pieza P
where not exists(select *
from Suministro S
where P.código=S.código));
23
Más ejemplos
Detectar qué eventos pueden afectar a la R.I.:
TABLA,
Suministro,
Suministro,
Pieza,
OPERACIÓN,
Borrado,
Modificación,
Inserción,
ATRIBUTO
código
-
Construir Triggers para controlar estos eventos.
Más ejemplos
CREATE TRIGGER T1
AFTER DELETE ON Suministro OR UPDATE OF codigo ON
Suministro
FOR EACH ROW
DECLARE
N: NUMBER;
BEGIN
SELECT COUNT(*) INTO N
FROM Suministro S
WHERE :old.codigo = S.codigo;
IF N=0 THEN
RAISE_APPLICATION_ERROR(-20000, ‘No se puede
borrar el suministro, porque la pieza se quedaría sin
suministros.’);
END IF;
END;
24
Más ejemplos
CREATE TRIGGER T2
AFTER INSERT ON Pieza
FOR EACH ROW
DECLARE N: NUMBER;
BEGIN
SELECT COUNT(*) INTO N
FROM Suministro S WHERE :new.codigo = S.codigo;
IF N=0 THEN
RAISE_APPLICATION_ERROR(-20000, ‘No se puede
insertar una pieza, porque la pieza no tiene suministros.
Cree las dos tuplas (la de pieza y la de suministro)
dentro de una transacción deshabilitando este trigger.’);
END IF;
END;
25
Descargar