sábado, 10 de agosto de 2013

TIPOS DE TRIGGERS

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');


No hay comentarios:

Publicar un comentario