domingo, 25 de enero de 2015

Triggers o Disparadores de Base de Datos




Los Triggers o disparadores de base de datos son bloques PL/SQL almacenados asociados a una tabla que se ejecutan automáticamente cuando se producen ciertos eventos o sucesos que afectan  a la tabla.

La sintaxis para crear un trigger es la siguiente: 

CREATE {OR REPLACE} TRIGGER nombre_disp
  [BEFORE|AFTER]
  [DELETE|INSERT|UPDATE {OF columnas}] [ OR [DELETE|INSERT|UPDATE {OF columnas}]...]
  ON tabla
  [FOR EACH ROW [WHEN condicion disparo]]
[DECLARE]
  -- Declaración de variables locales
BEGIN
  -- Instrucciones de ejecución
[EXCEPTION]
  -- Instrucciones de excepción
END;

El uso de OR REPLACE permite sobreescribir un trigger ya existente en Base de datos. 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 cada operación.   El modificador BEFORE AFTER indica si el trigger se ejecutará antes o despues de ejecutarse la sentencia SQL definida por DELETE, INSERT o 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 si 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. La cláusula WHEN sólo es válida para los disparadores con nivel de fila.

Dentro del ambito de un trigger disponemos de las variables OLD y NEW . Estas variables se utilizan del mismo modo que cualquier otra variable PL/SQL, con la salvedad de que no es necesario declararlas, son de tipo %ROWTYPE y contienen una copia del registro antes (OLD) y despues(NEW) de la acción SQL (INSERT, UPDATE, DELTE) que ha ejecutado el trigger. Utilizando esta variable podemos acceder a los datos que se están insertando, actualizando  o borrando.

El siguiente ejemplo muestra un trigger que inserta un registro en la tabla Clientes2 cada vez que insertamos un nuevo registro en la tabla Clientes1:


CREATE OR REPLACE TRIGGER TR_Clientes
  AFTER INSERT ON Clientes1
  FOR EACH ROW
DECLARE
  -- local variables 
BEGIN
  INSERT INTO Clientes2
  (Customer_Id,Customer_name,Customer_number)
  VALUES
  (:NEW.Customer_Id,:NEW.Customer_name,:NEW.Customer_number);
END ; 
Restricciones de los  Triggers

El cuerpo de un trigger es un bloque PL/SQL. Cualquier orden que sea legal en un bloque PL/SQL, es legal en el cuerpo de un disparador, con las siguientes restricciones:
  • Un disparador no puede emitir ninguna orden de control de transacciones:  COMMIT, ROLLBACK  o SAVEPOINT. El disparador se activa como parte de la ejecución de la orden que provocó el disparo, y forma parte de la misma transacción que dicha orden. Cuando la orden que provoca el disparo es confirmada o cancelada, se confirma o cancela también el trabajo realizado por el disparador.
  • Por razones idénticas, ningún procedimiento o función llamado por el disparador puede emitir órdenes de control de transacciones.
  • El cuerpo del disparador no puede contener ninguna declaración de variables LONG o LONG RAW
Uso variables  :OLD y :NEW   

Dentro de un trigger disponemos de las variables OLD y NEW . Estas variables se utilizan del mismo modo que cualquier otra variable PL/SQL, con la salvedad de que no es necesario declararlas, son de tipo %ROWTYPE y contienen una copia del registro antes (OLD) y despues(NEW) de la acción SQL (INSERT, UPDATE, DELETE) que ha ejecutado en el trigger. Utilizando esta variable podemos acceder a los datos que se están insertando, actualizando  o borrando.

El acceso a estos campos depende del evento del disparador:

En un trigger ejecutado por un INSERT, se puede acceder al campo :NEW uúnicamente el campo :OLDcontiene null. En una inserción se puede emplear :NEW para escribir nuevos valores en las columnas de la tabla.

En un trigger ejecutado con UPDATE, se puede acceder a ambos campos. En una actualizacion, se pueden comparar los valores :NEW y :OLD.

En un trigger ejecutado por un DELETE, únicamente se puede acceder al campo :OLD, ya que el campo :NEW no existe luego que el registro es eliminado, el campo :new contiene null y no puede ser modificado.

No hay comentarios:

Publicar un comentario