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.