0% encontró este documento útil (0 votos)
157 vistas17 páginas

Disparadores PL-SQL PDF

Este documento describe los disparadores de PL/SQL. Los disparadores son bloques de código PL/SQL asociados a tablas que se ejecutan automáticamente ante eventos como inserciones, modificaciones o borrados en las tablas. Los disparadores permiten realizar tareas como auditoría, actualizaciones en cascada u otras acciones automáticas. El documento explica los componentes de los disparadores, como su sintaxis, los registros :old y :new, las restricciones sobre tablas mutantes y provee varios ejemplos ilustrativos sobre el uso de
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
157 vistas17 páginas

Disparadores PL-SQL PDF

Este documento describe los disparadores de PL/SQL. Los disparadores son bloques de código PL/SQL asociados a tablas que se ejecutan automáticamente ante eventos como inserciones, modificaciones o borrados en las tablas. Los disparadores permiten realizar tareas como auditoría, actualizaciones en cascada u otras acciones automáticas. El documento explica los componentes de los disparadores, como su sintaxis, los registros :old y :new, las restricciones sobre tablas mutantes y provee varios ejemplos ilustrativos sobre el uso de
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 17

05/05/2010

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

DISPARADORES: Componentes (2)


Nivel:
FOR EACH ROW: disparadores con nivel de fila. Se activan una vez por cada fila afectada por el evento FOR EACK STATEMENT: disparadores con nivel de orden. Se activan slo una vez (antes o despus de la orden).

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: Componentes (3)


Cuerpo: bloque PL/SQL con las siguientes restricciones:
Un disparador no puede emitir ninguna orden de control de transacciones (COMMIT, ROLLBACK o SAVEPOINT) Ningn procedimiento o funcin llamada por el disparador puede emitir rdenes de control de transacciones. No puede contener ninguna declaracin de variables LONG o LONG RAW Restricciones en tablas a las que se puede acceder (Tablas Mutantes) No puede modificar las columnas de PK

Disparadores en PL/SQL

05/05/2010

Registros :old y :new


Un disparador con nivel de fila se ejecuta en cada fila en la que se produce el suceso. :old y :new son registros que nos permiten acceder a los datos de la fila actual Tipo de los registros: nombre_tabla%ROWTYPE;

Suceso INSERT UPDATE DELETE


Disparadores en PL/SQL

:old
NULL Valores almacenados Valores almacenados

:new
Nuevos valores Nuevos valores NULL
9

Ejemplo :old y :new


create sequence sec_estudiante start with 2; create table estudiante ( codigo number(2) primary key ); CREATE OR REPLACE TRIGGER t_estudiante_B BEFORE INSERT ON estudiante FOR EACH ROW BEGIN SELECT sec_estudiante.nextval INTO :new.codigo FROM dual; END t_estudiante;
NOTAS:
se ignoran los valores que se introducen como cdigo de estudiante --> se inserta el siguiente de la secuencia
Disparadores en PL/SQL 10

05/05/2010

INSERTING, DELETING Y UPDATING


Predicados de los disparadores (booleanas), empleadas para determinar qu operacin se est realizando en un disparador.
CREATE OR REPLACE TRIGGER Cambios BEFORE INSERT OR DELETE ON Alumnos FOR EACH ROW DECLARE Cambio_tipo CHAR(1); BEGIN /* Usa I para INSERT y D Para DELETE */ IF INSERTING THEN Cambio_tipo := I; ELSE Cambio_tipo := D; END IF; END Disparadores en Cambios;
PL/SQL

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

En los disparadores (1)


A nivel de FILA, dentro del cuerpo de un disparador, no puede existir:
lecturas o modificaciones de tablas mutantes cambio de clave primaria, claves ajenas o claves alternativas de las tablas que restringen (el resto de las columnas s se pueden cambiar) EXCEPCIN: no se dan las tablas mutantes en los disparadores con nivel de fila BEFORE INSERT

A nivel de SENTENCIA no existen problemas de tablas mutantes


EXCEPCIN: si disparador se activa como consecuencia de un BORRADO EN CASCADA (problemas de tablas mutantes)
Disparadores en PL/SQL 14

05/05/2010

En los disparadores (2)


TIPO DE DISPARADOR BEFORE INSERT ROW AFTER INSERT ROW BEFORE INSERT STATEMENT AFTER INSERT STATEMENT BEFORE DELETE ROW AFTER DELETE ROW BEFORE DELETE STATEMENT AFTER DELETE STATEMENT BEFORE UPDATE ROW AFTER UPDATE ROW BEFORE UPDATE STATEMENT AFTER UPDATE STATEMENT
1

ERROR DE TABLA MUTANTE NO1 SI NO NO SI SI NO2 NO2 SI SI NO NO

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.

CREATE SEQUENCE Secuencia_Departamento START WITH 100000 INCREMENT BY 1;

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.

Operacin 2: NO hay error. Al borrar de la tabla departamento no se desencadena ningn


borrado en cascada (slo borra de la tabla departamento)

Disparadores en PL/SQL

28

14

05/05/2010

Modificacin en Cascada (1)


EJEMPLO 6:
CREATE OR REPLACE TRIGGER Modificacion_Cascada BEFORE UPDATE OF Cod_Zona ON Zona FOR EACH ROW BEGIN UPDATE Departamento SET Cod_Zona = :new.Cod_Zona WHERE Cod_Zona = :old.Cod_Zona; END Modificacion_Cascada; / Operacin: UPDATE Zona SET Cod_Zona = 2 WHERE Cod_Zona = 1;

Disparadores en PL/SQL

29

Modificacin en Cascada (2)


EJEMPLO 6. Comentarios:
Error de tabla mutante La tabla departamento, que referencia a la tabla zona (FK), al modificarse, se han de comprobar las restricciones de integridad (consultar zona, que est mutando).

Disparadores en PL/SQL

30

15

05/05/2010

Modificacin en Cascada. Solucin (1)


CREATE TRIGER Modificacin_Cascada_Before BEFORE UPDATE OF DNI ON zona FOR EACH ROW . . . - Registra los datos en el paquete, capturando las imgenes previa y posterior de la clave de acceso. - Por ltimo, deshace la operacin (vuelve la clave a su valor original) CREATE TRIGER Modificacin_Cascada_After AFTER UPDATE OF DNI ON zona . . . - Duplica la fila a modificar, pero con la nueva clave - Actualiza los registros referenciantes (hijos) - Borra el registro replicado (el viejo)

1.- Modificacin BEFORE

* La modificacin en cascada las vamos a resolver con dos disparadores en fila, engaando a ORACLE.

2.- Modificacin AFTER

Disparadores en PL/SQL

31

Modificacin en Cascada. Solucin (2)


CREATE PACKAGE DatosZona AS TYPE t_CodZona IS TABLE OF Zona.Cod_Zona%TYPE INDEX BY BINARY_INTEGER; t_CodZonaOld t_CodZona; t_CodZonaNew t_CodZona; num_entradas BINARY_INTEGER:=0; END DatosZona; /

Disparadores en PL/SQL

32

16

05/05/2010

Modificacin en Cascada. Solucin (3)


CREATE OR REPLACE TRIGGER Modificacion_Cascada_Before BEFORE UPDATE OF Cod_Zona ON Zona FOR EACH ROW BEGIN DatosZona.num_entradas := DatosZona.num_entradas+1; DatosZona.t_CodZonaOld(DatosZona.num_entradas) := :old.Cod_Zona; DatosZona.t_CodZonaNew(DatosZona.num_entradas) := :new.Cod_Zona; :new.Cod_Zona := :old.Cod_Zona; END Modificacion_Cascada_Before; /

Disparadores en PL/SQL

33

Modificacin en Cascada. Solucin (4)


CREATE OR REPLACE TRIGGER Modificacion_Cascada_After AFTER UPDATE OF Cod_Zona ON Zona DECLARE CodZonaOld Zona.Cod_Zona%TYPE; CodZonaNew Zona.Cod_Zona%TYPE; BEGIN FOR i IN 1..DatosZona.num_entradas LOOP CodZonaOld := DatosZona.t_CodZonaOld(i); CodZonaNew := DatosZona.t_CodZonaNew(i); INSERT INTO Zona SELECT CodZonaNew, Nom_Zona FROM Zona WHERE Cod_Zona = CodZonaOld; UPDATE Departamento SET Cod_Zona = CodZonaNew WHERE Cod_Zona = CodZonaOld; DELETE FROM Zona WHERE Cod_Zona = CodZonaOld; END LOOP; DatosZona.num_entradas := 0; END Modificacion_Cascada_After; /

Disparadores en PL/SQL

34

17

También podría gustarte