Re: busco dos para desarrollo de triggers

From: Gunnar Wolf <gwolf(at)gwolf(dot)org>
To: emilio alvarez <dr7tbien(at)terra(dot)es>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: busco dos para desarrollo de triggers
Date: 2004-10-16 22:38:30
Message-ID: 20041016223829.GB19950@gwolf.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

emilio alvarez dijo [Sat, Oct 16, 2004 at 10:10:10PM +0000]:
> hace unos dias tuve la necesidad de hacer un trigger, busqué en la doc
> de postgres, lo hice y no me funcionó. Posteriromente escribi a este
> foro sobre porque no me funcionaba l trigger. Alvaro Herrera tuvo la
> amabilidad de conteestarme muy acertadamente y bien.
> Por lo que h visto en la doc de postgres no parece que esté bien
> explicado este tema. Podeis alguien aportar alguna url con doc sobree el
> tema triggers en postgresql?

Hola,

En realidad, escribir triggers es muy simple. Tienes que saber de
entrada un poco acerca de programación en pl/pgsql o algún otro
lenguaje que permita ser utilizado para triggers - Puede servirte este
textito, de Roberto Andrade (habitual de por acá), con el que yo dí
mis primeros pasos:

http://www.consol.org.mx/2002/ponencias/tutoriales/Roberto_Andrade_-_TUT_PL_pgSQL.pdf

Ya con esto: Para crear un trigger (en PostgreSQL 7.4.x) tienes
primero que crear una función que tenga la siguiente firma:

CREATE FUNCTION nombre_de_la_funcion() RETURNS trigger AS
'BEGIN
-- Cuerpo de la función
END;' LANGUAGE 'plpgsql';

esto es, una función que no reciba ningún argumento, y que regrese un
trigger. En PostgreSQL 7.2, si no me equivoco, tenía que regresar
OPAQUE... Pero no te preocupes, más vale que no uses versiones viejas
;-)

Ahora, dentro del trigger tienes acceso (sin tenerlos que declarar) a
uno o dos (dependiendo de la acción que realices) registros
especiales: NEW y OLD. Ambos son renglones de la tabla sobre la cual
está actuando el trigger, y puedes manipularlos como requieras para
tus operaciones.

Puedes colgar triggers a las tres operaciones que van a modificar una
tabla: Inserción, actualización y remoción. Me parece que para la
inserción trabajas únicamente con NEW, para la remoción con OLD, y
para la actualización tienes el renglón original en OLD y el nuevo en
NEW.

Tu trigger puede llevar a varias acciones - Desencadenar cambios en
esta misma o en otras tablas, modificar los datos enviados por el
cliente, abortar la operación, y probablemente varias más. Normalmente
la última línea de tu función va a ser un

RETURN NEW;

O sea, entrega el registro en cuestión, posiblemente modificado, para
su inserción o actualización (o RETURN OLD, creo, para eliminarlo). Si
quieres levantar un error (por ejemplo, si alguien manda datos de
alguna manera inconsistentes) puedes utilizar RAISE EXCEPTION para
abortar la función y la transacción.

Ya que tienes tu función hecha, tienes que amarrarlo a la acción que
lo va a desencadenar:

CREATE TRIGGER verifica_los_datos (BEFORE|AFTER)
(INSERT|UPDATE|DELETE) [OR (INSERT|UPDATE|DELETE) [OR
(INSERT|UPDATE|DELETE)]] ON tabla FOR EACH ROW EXECUTE PROCEDURE
nombre_de_la_funcion();

Como recomendación, yo busco siempre darle el mismo nombre al trigger
que a la función, a menos que estemos hablando de algo demasiado
general. Y claro, esto lo escribí de memoria, posiblemente esté
equivocado en algún punto.

Saludos,

--
Gunnar Wolf - gwolf(at)gwolf(dot)org - (+52-55)1451-2244 / 5554-9450
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Hugo Javier Gamarra Gomez 2004-10-17 14:37:59 Problemas para iniciar la Base
Previous Message emilio alvarez 2004-10-16 22:10:10 busco dos para desarrollo de triggers