Tema 1. Bases de datos activas

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