|
|
|
|
|
| Descargas: LyX | HTML | PDF | |
|
|
|
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:
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();
|
|
||||
|
||||
|
|
||||
| Regresar a: Página Principal. | ||||
|
|
||||
| © 2000, Proyecto S.O.B.L. | ||||