Descargas: LyX | HTML | PDF

9 Procedimientos Trigger

PL/pgSQL puede ser utilizado para definir triggers. Un procedimiento trigger es creado con el comando CREATE FUNCTION como una función sin argumentos y retornando un tipo trigger. Advierta que la función debe ser declarada sin argumentos, aunque espere recibir argumentos específicos en CREATE TRIGGER -los argumentos trigger son pasados vía TG_ARGV, como veremos más adelante-.

Cuando una función PL/pgSQL es denominada como trigger, varias variables especiales son creadas automáticamente en el bloque de nivel superior. Estas son:

NEW
Tipo de datos RECORD; variable que almacena la nueva fila de base de datos para operaciones INSERT/UPDATE en triggers de nivel ROW. Esta variable es NULL en los triggers de nivel STATEMENT.
OLD
Tipo de datos RECORD; variable que almacena la antigua fila de base de datos para operaciones UPDATE/DELETE en triggers de nivel ROW. Esta variable es NULL en triggers de nivel STATEMENT.
TG_NAME
Tipo de datos name; variable que contiene el nombre del trigger actualmente disparado.
TG_WHEN
Tipo de datos text; una cadena de BEFORE o AFTER dependiendo de la definición del trigger.
TG_LEVEL
Tipo de datos text; una cadena de ROW o STATEMENT dependiendo de la definición del trigger.
TG_OP
Tipo de datos text; una cadena de INSERT, UPDATE o DELETE indicando por cuál operación se disparó el trigger.
TG_RELID
Tipo de datos oid; el ID de objeto de la tabla que causó la invocación del trigger.
TG_RELNAME
Tipo de datos name; el nombre de la tabla que causó la invocación del trigger.
TG_NARGS
Tipo de datos integer; el número de argumentos proporcionado al procedimiento trigger en el estamento CREATE TRIGGER.
TG_ARGV[]
Tipo de datos array de text; los argumentos del estamento CREATE TRIGGER. El índice cuenta desde 0 y puede ser dado como expresión. Índices inválidos (< 0 or >= tg_nargs) resultan en un valor nulo.
Una función trigger debe retornar o NULL o un valor registro/fila teniendo exactamente la misma estructura de la tabla que disparó el trigger. El valor de retorno de un trigger de nivel BEFORE o AFTER STATEMENT, o un trigger de nivel AFTER ROW es ignorado; también puede retornar NULL. Sin embargo, cualquiera de estos tipos aún pueden abortar toda la operación del trigger lanzando un error.

Los triggers de nivel ROW lanzados antes (BEFORE) pueden retornar NULL para señalar al gestor del trigger que se salte el resto de la operación para esa fila (p.ej., subsecuentes triggers no son lanzados, y el INSERT/UPDATE/DELETE no ocurre para esa fila). Si un valor no NULL es retornado, entonces la operación procede con ese valor de fila. Advierta que retornar un valor de fila diferente del valor original del nuevo (NEW) altera la fila que será insertada o actualizada. Es posible reemplazar valores simples directamente en NEW y retornarlos, o construir un registro/fila completamente nuevo para retornarlo.

Ejemplo 19-1. Un Ejemplo de Procedimiento Trigger en PL/pgSQL

Este trigger asegura que en cualquier momento en que una fila sea insertada o actualizada en la tabla, el actual nombre de usuario y fecha/hora son almacenadas en la fila. Y garantiza que un nombre de empleado es dado y que el salario es un valor positivo.

CREATE TABLE emp ( 
       nombre_empleado text, 
       salario         integer,
       ultima_fecha    timestamp, 
       ultimo_usuario  text );

CREATE FUNCTION emp_stamp () RETURNS TRIGGER AS ' 
BEGIN 
  -- Comprueba que se proporcionan nombre_empleado y salario
  IF NEW.nombre_empleado ISNULL THEN 
     RAISE EXCEPTION ''El nombre del empleado no puede ser un valor NULO''; 
  END IF; 

  IF NEW.salario ISNULL THEN 
     RAISE EXCEPTION ''% no puede tener un salario NULO'', NEW.nombre_empleado; 
  END IF;

  -- ¿Quién trabaja gratis?
  IF NEW.salario < 0 THEN 
     RAISE EXCEPTION ''% no puede tener un salario negativo'', NEW.nombre_empleado; 
  END IF;

  -- Recuerda quién y cuándo hizo el cambio
  NEW.ultima_fecha   := ''now''; 
  NEW.ultimo_usuario := current_user; 
  RETURN NEW; 
END; 
' LANGUAGE 'plpgsql';

CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp 
       FOR EACH ROW EXECUTE PROCEDURE emp_stamp();


<   8.1 Excepciones 10 Ejemplos   >

Regresar a: Página Principal.

© 2000, Proyecto S.O.B.L.