18 de marzo de 2002 1 Tema 1. Bases de datos activas 1. Introducción 2. El modelo evento-condición-acción Definición y uso de disparadores en Oracle Caracterı́sticas de las reglas activas 3. Propiedades de las reglas activas 4. Aplicaciones de las bases de datos activas Tema 1. Bases de datos activas 18 de marzo de 2002 2 Bases de datos PASIVAS Bases de datos ACTIVAS ⇓ ⇓ la evolución de la BD se la evolución de la BD se programa en las aplicaciones define en el esquema de la BD 18 de marzo de 2002 3 Prestamos(DNI,signatura,fecha prestamo,fecha devol) Sanciones(DNI,fecha caduca) cada dı́a a las 24 horas si existe un libro prestado que tenı́a que haber sido devuelto en el dı́a entonces generar una sanción cada dı́a a las 24 horas si existe un sancionado cuya sanción ha caducado en el dı́a entonces borrar la sanción al realizar un préstamo si el usuario está sancionado entonces rechazar el préstamo Tema 1. Bases de datos activas 18 de marzo de 2002 4 Se ejecutan acciones como respuesta a una situación. situación = evento + condición Para definir el comportamiento del sistema se utilizan reglas activas y el modelo Evento–Condición–Acción (ECA). 18 de marzo de 2002 5 Ventajas: Mayor independencia de datos. Integración de distintos subsistemas. Extensión del ámbito de aplicación. Tema 1. Bases de datos activas 18 de marzo de 2002 Algunas aplicaciones: Respetar reglas de integridad. Generar datos derivados. Controlar la seguridad. Implementar reglas de negocio. ... 6 18 de marzo de 2002 7 Tipos de eventos: Operaciones de actualización de datos, de consulta o de control de transacciones. Instantes o periodos de tiempo. Sucesos definidos por el usuario. Además, se debe poder especificar: Composiciones lógicas de eventos (AND, OR, . . . ). Secuencias de eventos. Tema 1. Bases de datos activas 18 de marzo de 2002 Reglas activas en los sistemas relacionales: disparadores (triggers) Evento: INSERT, UPDATE, DELETE. Condición: predicado del WHERE (SELECT). Acción: sentencias de SQL embebidas en un lenguaje de programación. 8 18 de marzo de 2002 9 El disparador es activado por el evento, es considerado durante la verificación de su condición y es ejecutado si la condición es cierta. Granularidad: A nivel de fila → orientado a tuplas. A nivel de sentencia → orientado a conjuntos. Funcionalidad: Inmediata: antes / después / en lugar de. Diferida. Además, los disparadores se pueden activar en cascada. Tema 1. Bases de datos activas 18 de marzo de 2002 Disparadores en Oracle: 10 18 de marzo de 2002 11 Almacen(CodPieza,CantDisp,CantLim,CantPedido) Pedidos(CodPieza,CantPedido,Fecha) CREATE TRIGGER TrigPedido AFTER UPDATE OF CantDisp ON Almacen FOR EACH ROW WHEN (NEW.CantDisp < NEW.CantLim) declare x number; begin SELECT COUNT(*) INTO x FROM Pedidos WHERE CodPieza = :NEW.CodPieza; if x = 0 then INSERT INTO Pedidos VALUES (:NEW.CodPieza, :NEW.CantPedido, SYSDATE); end if; end; Tema 1. Bases de datos activas 18 de marzo de 2002 CREATE TRIGGER TrigEmpCambiosPermitidos BEFORE INSERT OR DELETE OR UPDATE ON Emp declare x number; fin de semana exception; dia festivo exception; fuera horario trabajo exception; begin -- comprobar si es fin de semana if (to char(sysdate,’DY’=’SAT’) or to char(sysdate,’DY’)=’SUN’) then raise fin de semana; end if; -- comprobar si es un dia festivo SELECT COUNT(*) INTO x FROM Festivos WHERE TRUNC(Dia) = TRUNC(SYSDATE); if x 6= 0 then raise dia festivo; end if; -- comprobar si es horario de trabajo if (to char(sysdate,’HH24’) < 8 or to char(sysdate,’HH24’) > 18) then raise fuera horario trabajo; end if; 12 18 de marzo de 2002 13 exception when fin de semana then raise application error(-20324,’No se puede cambiar ’ ||’la tabla empleado durante el fin de semana.’); when dia festivo then raise application error(-20325,’No se puede cambiar ’ ||’la tabla empleado en dia festivo.’); when fuera horario trabajo then raise application error(-20326,’No se puede cambiar ’ ||’la tabla empleado fuera del horario de trabajo.’); end; Tema 1. Bases de datos activas 18 de marzo de 2002 CREATE TRIGGER TrigCompruebaSalario BEFORE INSERT OR UPDATE OF Salario, Puesto ON Emp FOR EACH ROW declare minsal number; maxsal number; salario fuera rango exception; begin SELECT Minsal, Maxsal INTO minsal, maxsal FROM Salarios WHERE Puesto = :NEW.Puesto; if (:NEW.Salario < minsal or :NEW.Salario > maxsal) then raise salario fuera rango; end if; exception when salario fuera rango then raise application error(-20300,’Salario ’|| to char(:NEW.Salario)||’ fuera de rango para el puesto ’ ||:NEW.Puesto||’ del empleado ’||:NEW.Nombre); end; 14 18 de marzo de 2002 15 CREATE TRIGGER TrigAuditEmp AFTER INSERT OR UPDATE OR DELETE ON Emp FOR EACH ROW declare fecha date; terminal char(10); begin fecha := sysdate; terminal := userenv(’TERMINAL’); if INSERTING then INSERT INTO AudiTabla VALUES(audit seq.NEXTVAL,user,fecha,terminal,’Emp’, ’INSERT’,:NEW.numemp); elsif DELETING then INSERT INTO AudiTabla VALUES(audit seq.NEXTVAL,user,fecha,terminal,’Emp’, ’DELETE’,:OLD.numemp); Tema 1. Bases de datos activas 18 de marzo de 2002 16 else INSERT INTO AudiTabla VALUES(audit seq.NEXTVAL,user,fecha,terminal,’Emp’, ’UPDATE’,:OLD.numemp); if UDATING(’Salario’) then INSERT INTO AudiTablaValores VALUES(audit seq.CURRVAL,’Salario’,:OLD.Salario,:NEW.Salario); elsif UPDATING(’Deptnum’) then INSERT INTO AudiTablaValores VALUES(audit seq.CURRVAL,’Salario’,:OLD.Deptnum,:NEW.Deptnum) end if; end if; end; 18 de marzo de 2002 17 CREATE VIEW ClientesTodos(Codcli,Direccion,Credito,Provincia) AS SELECT Codcli,Direccion,Credito,’Castellon’ FROM ClientesCS UNION SELECT Codcli,Direccion,Credito,’Valencia’ FROM ClientesVC; CREATE TRIGGER TrigInsClientesTodos INSTEAD OF INSERT ON ClientesTodos FOR EACH ROW begin if (:NEW.Provincia = ’Castellon’) then INSERT INTO ClientesCS VALUES(:NEW.Codcli,:NEW.Direccion,:NEW.Credito) else INSERT INTO ClientesVC VALUES(:NEW.Codcli,:NEW.Direccion,:NEW.Credito) end if; end; Tema 1. Bases de datos activas 18 de marzo de 2002 Algoritmo de ejecución: 1. Se consideran los disparadores de nivel BEFORE STATEMENT y se ejecutan. 2. Para cada tupla de la tabla sobre la que actúa la sentencia: a) Se consideran los disparadores de nivel BEFORE ROW y se ejecutan. b) La sentencia se aplica a la tupla y a continuación se realizan las comprobaciones de la integridad que se hayan especificado (CHECK). c) Se consideran los disparadores de nivel AFTER ROW y se ejecutan. 3. Se llevan a cabo las comprobaciopnes de la integridad especificadas para la tabla. 4. Se consideran los disparadores de nivel AFTER STATEMENT y se ejecutan. 18 18 de marzo de 2002 19 ¡No es tan fácil! CREATE TRIGGER TrigPrestamos AFTER INSERT OR UPDATE OF Dni ON Prestamos FOR EACH ROW declare x number; begin SELECT COUNT(*) INTO x FROM Prestamos WHERE Dni = :NEW.Dni; if x >2 then raise application error(-20000,’El socio ’||:NEW.Dni ||’ excede el numero de prestamos permitidos.’); end if; end; Error de ejecución: Prestamos es una tabla mutante. Tema 1. Bases de datos activas 18 de marzo de 2002 Una posible solución: CREATE TRIGGER TrigPrestamos1 AFTER INSERT OR UPDATE OF Dni ON Prestamos FOR EACH ROW begin INSERT INTO PrestamosTmp VALUES(:NEW.Dni,:NEW.Signatura); end; CREATE TRIGGER TrigPrestamos2 AFTER INSERT OR UPDATE OF Dni ON Prestamos FOR EACH STATEMENT declare curdni char(9); x number; exceso prestamos exception; cursor CurPrestamos is SELECT DISTINCT Dni FROM PrestamosTmp 20 18 de marzo de 2002 21 begin open CurPrestamos; fetch CurPrestamos into curdni; while (CurPrestamos %notfound) loop SELECT COUNT(*) INTO x FROM Prestamos WHERE Dni = curdni if x > 3 then raise exceso prestamos; end if; fetch CurPrestamos into curdni; end loop; close CurPrestamos; DELETE FROM PrestamosTmp; exception when exceso prestamos then close CurPrestamos; DELETE FROM PrestamosTmp; raise application error(-20000,’El socio ’||curdni ||’ excede el numero de prestamos permitidos.’); end; Tema 1. Bases de datos activas 18 de marzo de 2002 Otras caracterı́sticas de las reglas activas: También soportar eventos temporales o definidos por el usuario. Activación por conjunto de eventos relacionados. Consideración/ejecución retrasadas. Ordenación de reglas. Habilitación/deshabilitación de conjuntos de reglas. 22 18 de marzo de 2002 23 Propiedades de las reglas activas: Terminación. Confluencia. Idéntico comportamiento observable. Tema 1. Bases de datos activas 18 de marzo de 2002 ¿Qué pasa aquı́? CREATE TRIGGER Trig1 AFTER INSERT ON TablaX FOR EACH ROW begin UPDATE TablaY SET Col = ...; end; CREATE TRIGGER Trig2 AFTER UPDATE OF Col ON TablaY FOR EACH ROW begin INSERT INTO TablaX VALUES(...); end; 24 18 de marzo de 2002 25 Aplicaciones: Aplicaciones internas: reglas generadas por el sistema, no visibles a los usuarios. Mantenimiento de datos derivados. Mantenimiento de la consistencia de vistas materializadas. Mantenimiento de la consistencia en tablas replicadas. Generación de avisos ante sucesos concretos. Mantenimiento de la seguridad y auditorı́a. Mantenimiento de reglas de negocio. Tema 1. Bases de datos activas