Disparadores PL-SQL PDF
Disparadores PL-SQL PDF
Disparadores de PL/SQL
DISPARADORES
Bloques de PL/SQL nominados con las secciones:
declarativa ejecutable manejo de excepciones
Almacenados en la BD (diccionario de datos: user_triggers) y asociados a una tabla. Puede afectar a n filas. Se ejecuta de manera implcita ante eventos (operacin de insercin, modificacin o borrado sobre una BD) Se compila cada vez que lo activa --> ms lentos
Disparadores en PL/SQL 2
05/05/2010
DISPARADORES:Aplicaciones
Restricciones de Integridad complejas. IMPORTANTE: no se deben usar para garantizar el cumplimiento de las RI a nivel de esquema !!! (el esquema ha de contener toda la semntica que permita sin utilizar disparadores) Auditora: registro de los cambios realizados y quin los realiz Aviso automtico a otros programas de llevar a cabo una determinada accin Actualizacin en cascada
Disparadores en PL/SQL
DISPARADORES:Utilizacin
No disparadores recursivos: agotan memoria. Slo se almacena el cdigo fuente del disparador. Se compila cada vez que se va a ejecutar (lectura del diccionario de datos). Por lo tanto si el disparador tiene ms de 60 lneas de cuerpo conviene hacer un procedimiento. No utilizar para RI simples (a nivel de esquema). Identificador nico para cada elemento.
Disparadores en PL/SQL
05/05/2010
DISPARADORES:Sintaxis
Creacin: (se activan al crearlos)
CREATE [OR REPLACE] TRIGGER <nombre_disparador> {BEFORE | AFTER} evento ON referencia_tabla [ FOR EACH ROW [WHEN condicin_evento]] cuerpo_disparador;
Eliminacin:
DROP TRIGGER nombre_disparador;
Activacin/Desactivacin:
ALTER TRIGGER nombre_disparador {DISABLE | ENABLE}; ALTER TABLE nombre_tabla {ENABLE | DISABLE} ALL TRIGGERS;
Disparadores en PL/SQL 5
DISPARADORES:Componentes (1)
Nombre disparador:
Siguen las mismas normas de nomenclatura que otros identificadores en la BD
Replace:
Se utiliza para sobreescribir un disparador existente
Before/After:
Instante de ejecucin del disparador con respecto al evento
Evento:
Tipo de orden DML sobre una tabla que provoca la activacin del disparador {INSERT | DELETE | UPDATE [OF <lista de columnas>]}. La lista de columnas slo tiene sentido en el evento UPDATE
Disparadores en PL/SQL 6
05/05/2010
When: Slo tiene sentido a nivel de fila. La condicin se evala (true o false). No se pueden utilizar consultas anidadas.
Disparadores en PL/SQL
Disparadores en PL/SQL
05/05/2010
:old
NULL Valores almacenados Valores almacenados
:new
Nuevos valores Nuevos valores NULL
9
05/05/2010
11
Tablas Mutantes
05/05/2010
Qu son
Tablas que estn siendo modificadas por una operacin DML (INSERT, DELETE, UPDATE):
En un disparador, la tabla sobre la que est definido Tablas que sern actualizadas como consecuencia de la integridad referencial (P.e.: DELETE_CASCADE)
Disparadores en PL/SQL
13
05/05/2010
Siempre que la insercin que provoque la activacin del disparador sea una insercin simple (se inserte una nica fila). 2 Siempre que el disparador no se active como consecuencia de un borrado en cascada. En ese caso, aparecer tambin un error de tabla mutante.
Disparadores en PL/SQL 15
Ejemplo (1)
Una zona tiene uno o varios departamentos y un departamento trabaja en una o ninguna zona.
Disparadores en PL/SQL
16
05/05/2010
Ejemplo (2)
CREATE TABLE Zona ( Cod_Zona NUMBER(6) CONSTRAINT pk_zona PRIMARY KEY, Nom_Zona VARCHAR2(40) NOT NULL ); CREATE TABLE Departamento ( Cod_Dep NUMBER(6) CONSTRAINT pk_departamento PRIMARY KEY, Presupuesto NUMBER(8) NOT NULL, Cod_Zona NUMBER(2) NOT NULL CONSTRAINT fk_departamento_zona REFERENCES Zona(Cod_Zona) ON DELETE CASCADE );
Disparadores en PL/SQL
17
Ejemplo 1 (1)
EJEMPLO 1:
CREATE OR REPLACE TRIGGER Disparador1 AFTER INSERT ON Zona FOR EACH ROW BEGIN INSERT INTO Departamento VALUES (Secuencia_Departamento.NEXTVAL, 10000000, :new.Cod_Zona); END Disparador1; /
Operacin:
INSERT INTO Zona VALUES (1, CENTRO);
Disparadores en PL/SQL
18
05/05/2010
Ejemplo 1 (2)
EJEMPLO 1. Comentarios:
La tabla departamento referencia a la tabla zona (FK). Cada vez que se inserta un nuevo dato en la tabla departamento, Oracle controla la integridad referencial (el cdigo Departamento.Cod_Zona ha de existir en la tabla Zona --> Realiza una lectura de la tabla Zona, que est mutando !!) NOTA: Si en lugar de realizar una insercin en la tabla departamento, hubiramos realizado una seleccin, no habra dado error de tabla mutante.
Disparadores en PL/SQL
19
Ejemplo 2 (1)
EJEMPLO 2:
CREATE OR REPLACE TRIGGER Disparador2 AFTER INSERT ON Departamento FOR EACH ROW DECLARE Var Departamento%ROWTYPE; BEGIN UPDATE Zona SET Nom_Zona='U' WHERE Cod_Zona=:new.Cod_Zona; END Disparador2; /
Operacin:
INSERT INTO Departamento VALUES (Secuencia_Departamento.NEXTVAL, 20000000, 1);
Disparadores en PL/SQL
20
10
05/05/2010
Ejemplo 2 (2)
EJEMPLO 2. Comentario:
No existe error de tabla mutante: la tabla departamento referencia a la tabla zona, por lo que no se pueden modificar sus claves, pero s se pueden modificar las dems columnas. En el caso de que el disparador fuese BEFORE insert row, no existira error de tabla mutante ni siquiera si se modifican sus claves.
Disparadores en PL/SQL
21
Ejemplo 3 (1)
EJEMPLO 3:
Creacin de una tabla independiente a las anteriores:
CREATE SEQUENCE Secuencia_Mensaje START WITH 100000 INCREMENT BY 1; CREATE TABLE Mensaje_Departamento ( Cod_Mensaje NUMBER(6) CONSTRAINT pk_error PRIMARY KEY, Cod_Dep NUMBER(6) NOT NULL, Tipo VARCHAR2(255) NOT NULL, Fecha DATE NOT NULL );
Disparadores en PL/SQL
22
11
05/05/2010
Ejemplo 3 (2)
EJEMPLO 3. Disparador:
CREATE OR REPLACE TRIGGER Disparador3 AFTER INSERT ON Departamento FOR EACH ROW BEGIN INSERT INTO Mensaje_Departamento VALUES (Secuencia_Mensaje.NEXTVAL, :new.Departamento, elevado', SYSDATE); END Disparador3; /
'Presupuesto
Operacin:
INSERT INTO Departamento VALUES (Secuencia_Departamento.NEXTVAL, 70000, 1);
Disparadores en PL/SQL
23
Ejemplo 3 (3)
EJEMPLO 3. Comentarios:
No existe error de tabla mutante: la tabla mensaje_departamento es independiente de la tabla departamento.
Disparadores en PL/SQL
24
12
05/05/2010
Ejemplo 4 (1)
EJEMPLO 4:
CREATE OR REPLACE TRIGGER Disparador4 BEFORE DELETE ON Departamento FOR EACH ROW DECLARE Var Zona%ROWTYPE; BEGIN SELECT * INTO Var FROM Zona WHERE Cod_Zona=:old.Cod_Zona; END Disparador4; / Operacin1: DELETE FROM Departamento WHERE Cod_Zona=1; Operacin2: DELETE FROM Zona WHERE Cod_Zona=1;
Disparadores en PL/SQL
25
Ejemplo 4 (2)
EJEMPLO 4. Comentarios:
Operacin 1: No da error de tabla mutante: departamento referencia a la tabla zona, que s se puede consultar, ya que no est mutando. Operacin 2: Da error de tabla mutante, ya que, al borrar en la tabla zona (tabla mutante), se borran todas las las tuplas de la tabla departamento que referencian a la zona borrada. Esto activa el disparador4 de departamento, que consulta la tabla zona, que en este caso s esta mutando.
Disparadores en PL/SQL
26
13
05/05/2010
Ejemplo 5 (1)
EJEMPLO 5:
CREATE OR REPLACE TRIGGER Disparador5 AFTER DELETE ON Departamento DECLARE Var Zona%ROWTYPE; BEGIN SELECT * INTO Var FROM Zona WHERE Cod_Zona=1; END Disparador5; / Operacin 1: DELETE FROM Zona WHERE Cod_Zona = 1; Operacin 2: DELETE FROM Departamento WHERE Cod_Zona = 1;
Disparadores en PL/SQL
27
Ejemplo 5 (2)
EJEMPLO 5. Comentarios:
Operacin 1: Error de tabla mutante.
La excepcin en los disparadores a nivel de sentencia se encuentra en los borrados en cascada, al leer o modificar una tabla mutante. Al borrar de la tabla zona, se desencadena un borrado en cascada en la tabla departamento (ambas tablas mutantes), y al mismo tiempo intenta leer de la tabla zona.
Disparadores en PL/SQL
28
14
05/05/2010
Disparadores en PL/SQL
29
Disparadores en PL/SQL
30
15
05/05/2010
* La modificacin en cascada las vamos a resolver con dos disparadores en fila, engaando a ORACLE.
Disparadores en PL/SQL
31
Disparadores en PL/SQL
32
16
05/05/2010
Disparadores en PL/SQL
33
Disparadores en PL/SQL
34
17