> Manuales > Tutorial de Oracle

Explicamos que son los triggers o disparadores de base de datos en PL/SQL de Oracle.

Como ya comentábamos en el articulo anterior, publicado en el Manual de Oracle de DesarrolloWeb.com, comenzamos lo que podríamos denominar programación avanzada dentro de PL/SQL.

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 trigger
nombre: 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:


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:

  1. Antes de comenzar a ejecutar la orden que provoca el disparo se ejecutaran los triggers del tipo before.... for each statement
  2. 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
  3. Una vez realizada la operación se ejecuta el after … for each statement
Cuanndo se dispara un trigger este forma parte de la operación que lo disparó de manera que si el trigger falla, Oracle dará por fallida la operación completa. Aunque el fallo sea a nivel de fila se hará rollback a toda la operación.

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.

Sara Alvarez

Equipo DesarrolloWeb.com

Manual