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