Explicamos que son los triggers o disparadores de base de datos en PL/SQL de Oracle.
En el presente artículo vamos a estudiar acerca de los triggers, donde veremos qué son y como se construyen, comenzando con los trigger de tablas y más tarde veremos los trigger de sustitución y los de sistema. Para ello lo primero que tenemos que ver es su definición.
Trigger a tablas
Un trigger es un bloque de código PL/SQL que se almacenan en la base de datos. Los bloques de código de los triggers están asociados a una tabla y se ejecutan automáticamente cuando se producen ciertos eventos asociados a la tabla.Se suelen utilizar para prevenir transacciones erróneas y nos sirven también para implementar restricciones de integridad o seguridad.
Su formato básico es el siguiente:
create or replace trigger nombre_trigger
   {before | after} {delete | insert | update[of lista_columnas]}
   [or {before | after} {delete|insert|update [of lista_columnas]}]
   on nombre_tabla
   [for each {row | statement | when (condición)}]
   /* comienza el trigger */
   [declare]
      <declaraciones>
   begin
      <instrucciones>
   [exception]
      <excepciones>
end;
Elementos de un trigger
before / after: elemento que dispara el triggernombre: nombre del trigger que tiene que ser único.
for each: nivel del disparo del trigger que por defecto es statement que significa que se dispara una sola vez por cada operación independientemente del número de filas afectadas.
for each row: salta por cada fila afectada.
Variables posibles para update: la primera es :old que hace referencia a los valores anteriores y :new que hace referencia a los nuevos valores de actualización de la fila.
Tenemos que tener en cuanta unos cuantos aspectos:
- Cuando el evento que dispara el trigger es un delete haremos referencia al valor :old porque el valor :new es nulo
- Cuando el evento que dispara el trigger es un insert haremos referencia al valor :new porque el :old es nulo.
- Cuando el evento es un update tiene sentido hacer referencia a los dos valores.
- Sólo se pueden utilizar cuando el trigger es a nivel de fila (for each row).
Vamos a a crear un trigger que se disparé automáticamente después de la modificación del salario de la tabla empleado y pase un comentario a la tabla auditar.
Create or replace trigger auditar_salario
      after update of salario
      on empleado
      for each row
   begin
insert into auditar values 
         ('se ha modificado el salario' || :old.num_empleado);
   end;
Orden de ejecución de los trigger
Una misma tabla puede tener varios triggers y el orden de disparo seria el siguiente:
- Antes de comenzar a ejecutar la orden que provoca el disparo se ejecutaran los triggers del tipo before.... for each statement
-  Para cada fila afectada por la orden:
		
 a) se ejecutan los triggers del tipo before for each row
 b) se ejecuta la actualización de la fila
 c) se ejecutan los triggers after... for each row
- Una vez realizada la operación se ejecuta el after for each statement
Ejemplo:
create or replace trigger nombre_trigger
   before insert or delete
begin
   if insert then
      .....
   elseif deleting then
      ....
   elseif updating then
      ...
   end if
   ....
end;
En el siguiente articulo veremos los triggers de sustitución y los del sistema.