TIPOS DE TRIGGERS
Trigger
de filas y de sentencia
Cuando se define un trigger se
puede especificar el número de veces que se va a ejecutar la acción:
·
Una vez por cada fila afectada por las sentencia de disparo.
·
Una vez por cada sentencia de disparo; esto puede ser útil
si el código de la acción del trigger no depende de los datos provistos por el
trigger o las filas afectadas.
Triggers
BEFORE y AFTER
En este caso se determina el
momento en que se ejecuta la acción trigger, si antes o después de la sentencia
de disparo.
BEFORE
Este tipo de trigger se debe
ejecutar cuando:
·
Cuando la acción del trigger debe determinar si le permite
finalizar a la sentencia de disparo.
·
Si se deben verificar valores específicos de columnas antes
de completar una sentencia de disparo INSERT o UPDATE
AFTER
Se debe emplear este tipo de
trigger cuando:
·
Cuando se quiere completar la sentencia de disparo antes de
ejecutar la acción del trigger.
·
Si ya existe un trigger BEFORE un AFTER puede realizar
diferentes acciones con la misma sentencia de disparo.
Combinaciones
La acción del trigger. siempre que no se viole
la restricción del trigger, se ejecuta dependiendo de la combinación de tipos
de trigger:
BEFORE statement: antes de
ejecutar la sentencia de disparo.
BEFORE row: antes de modificar
cada fila afectada por la sentencia de disparo, y antes de chequear las
restricciones de integridad apropiadas.
AFTER statement: después de
ejecutar la sentencia de disparo, y después de chequear las restricciones de
integridad apropiadas.
AFTER row: después de modificar
cada fila afectada por la sentencia de disparo y posiblemente aplicando las
restricciones de integridad apropiadas. A diferencia de los trigger de filas
BEFORE, los AFTER BLOQUEAN las filas.
Se pueden tener múltiples
triggers del mismo tipo para la misma sentencia para la tabla que sea.
Triggers INSTEAD OF
Estos triggers brindan una manera
transparente de modificar vistas que no pueden ser modificadas directamente por
medio de sentencias DML.
Se llaman INSTEAD OF porque a
diferencia de otros tipos de triggers Oracle dispara el trigger en lugar de
ejecutar la sentencia de disparo.
El usuario escribe operaciones
normales de INSERT, UPDATE o DELETE sobre la vista y el trigger INSTEAD OF
realiza las operaciones correctas sobre las tablas bases.
La sintaxis para crear un trigger es la
siguiente:
CREATE [OR REPLACE] TRIGGER <nombre_trigger> {BEFORE|AFTER} {DELETE|INSERT|UPDATE [OF col1, col2, ..., colN] [OR {DELETE|INSERT|UPDATE [OF col1, col2, ..., colN]...]} ON <nombre_tabla> [FOR EACH ROW [WHEN (<condicion>)]] DECLARE -- variables locales BEGIN -- Sentencias [EXCEPTION] -- Sentencias control de excepcion END <nombre_trigger>; |
El
uso de OR REPLACE permite sobreescribir un trigger existente. Si se omite, y el
trigger existe, se producirá, un error.
Los triggers pueden
definirse para las operaciones INSERT, UPDATE o DELETE, y
pueden ejecutarse antes o después de la operación. El
modificador BEFORE AFTER indica que el trigger se ejecutará antes o despues de
ejecutarse la sentencia SQL definida por DELETE INSERT UPDATE. Si
incluimos el modificador OF el trigger solo se ejecutará cuando la sentencia
SQL afecte a los campos incluidos en la lista.
El alcance de los disparadores
puede ser la fila o de orden. El modificador FOR EACH ROW indica que
el trigger se disparará cada vez que se realizan operaciones sobre una
fila de la tabla. Si se acompaña del modificador WHEN, se establece una
restricción; el trigger solo actuará, sobre las filas que satisfagan la
restricción.
La siguiente
tabla resume los contenidos anteriores.
Valor
|
Descripción
|
INSERT, DELETE, UPDATE
|
Define qué tipo de orden DML provoca la activación del disparador.
|
BEFORE , AFTER
|
Define si el disparador se activa antes o después de que se ejecute la
orden.
|
FOR EACH ROW
|
Los disparadores con nivel de fila se activan una vez por cada fila
afectada por la orden que provocó el disparo. Los disparadores con nivel de
orden se activan sólo una vez, antes o después de la orden. Los disparadores
con nivel de fila se identifican por la cláusula FOR EACH ROW en la
definición del disparador.
|
La cláusula WHEN sólo es válida
para los disparadores con nivel de fila.
El siguiente ejemplo muestra un trigger que
inserta un registro en la tabla PRECIOS_PRODUCTOS cada vez que insertamos un
nuevo registro en la tabla PRODUTOS:
CREATE OR REPLACE TRIGGER TR_PRODUCTOS_01 AFTER INSERT ON PRODUCTOS FOR EACH ROW DECLARE -- local variables BEGIN INSERT INTO PRECIOS_PRODUCTOS (CO_PRODUCTO,PRECIO,FX_ACTUALIZACION) VALUES (:NEW.CO_PRODUCTO,100,SYSDATE); END ; |
El
trigger se ejecutará cuando sobre la tabla PRODUCTOS se ejecute
una sentencia INSERT.
INSERT INTO PRODUCTOS (CO_PRODUCTO, DESCRIPCION) VALUES ('000100','PRODUCTO 000100'); |
Bibliografía: http://es.wikibooks.org/wiki/Manual_del_estudiante_de_Ingenier%C3%ADa_en_Sistemas_d e_UTN/Bases_de_datos_avanzadas/Triggers
No hay comentarios:
Publicar un comentario