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
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 |