6.4. Disparadores

Las funciones deben llamarse explícitamente para su ejecución o para incluirlas en consultas. Sin embargo, se puede definir que algunas funciones se ejecuten automáticamente cuando cierto evento tenga lugar en cierta tabla. Estas funciones se conocen como disparadores o triggers y se ejecutan mediante los comandos insert, delete y uptade.

Agregamos la tabla historial que almacena los productos descontinuados cuando se eliminan de la tabla productos.

create table historial (fecha date, parte varchar(20),  tipo varchar(20), especificacion varchar(20),  precio float(6));

Para poder utilizar una función como disparador, no debe recibir argumentos y debe retornar el tipo especial trigger:

La variable old está predefinida por  
PostgreSQL y se refiere al registro    con sus antiguos valores. Para          referirse a los nuevos valores,          
se dispone de la variable new.          

create function respaldar_borrados() returns trigger as
 begin insert into historial values ( now(),  old.parte,  old.tipo, old.especificacion, old.psugerido );
 return null;
end;

La función está lista para ser utilizada como disparador, sólo es necesario definirlo y asociarlo a la tabla y al evento deseado:

create trigger archivar  before delete on productos
for each row execute procedure respaldar_borrados();

 

Acabamos de crear un disparador de nombre archivar que se activará cuando se ejecute el comando delete en la tabla productos. El usuario no necesita saber que se debe hacer una copia de seguridad de los registros borrados, se hace automáticamente.

Al crear el disparador, hemos especificado “before delete” al indicar la operación. PostgreSQL nos permite lanzar el disparador antes o después (before, after) que se efectúen las operaciones. Este matiz es importante, ya que, si este mismo disparador lo ejecutamos después de la operación, no veremos ninguna fila en la tabla. Es posible definir el mismo disparador para varias operaciones:

create trigger archivar  before delete or update  on productos

for each row execute procedure respaldar_borrados();