From: | "Jaime Casanova" <systemguards(at)gmail(dot)com> |
---|---|
To: | "Jorge Herrera Roures" <jherreraroures(at)gmail(dot)com> |
Cc: | pgsql-es-ayuda(at)postgresql(dot)org(dot) |
Subject: | Re: Problemas con recursividad en triggers |
Date: | 2008-04-06 13:44:28 |
Message-ID: | c2d9e70e0804060644i34ffcc64n33e6d898a4a7c915@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
2008/4/5 Jorge Herrera Roures <jherreraroures(at)gmail(dot)com>:
> Hola amigos, tengo un problema y no se como resolverlo. Os cuento.
>
> Tengo una tabla "Recetas", la cual, cada vez que se efectúe un cambio
> (insert o update) quiero guardar una copia en otra tabla de históricos,
> "Recetas_hist" con el mismo registro.
>
> En la tabla Recetas tengo dos campos timestamp, Timestamp_alta,
> Timestamp_mod.
> Cuando se realiza un insert, Timestamp_alta se informa automáticamente y
> Timestamp_mod contiene nulos, puesto que así sabemos que aún no se ha
> modificado.
>
> El problema viene cuando actualizamos el registro. Ya que Timestamp_mod
> tiene que contener la fecha en la que se actualiza el registro y quiero que
> se haga automáticamente, sin pasársela yo en el update.
>
> He creado un trigger para que cuando se actualice Recetas inserte en
> Recetas_hist, pero antes tiene que informar el Timestamp_mod en Recetas para
> que aparezca en las dos tablas con el mismo valor, lo que ocurre es que al
> hacer el update sobre Recetas dentro del trigger se vuelve recursivo.
>
> Os adjunto el trigger.
[...]
> Podría informar de alguna manera el campo Timestamp_mod de Recetas dentro
> del trigger sin que se volviese a disparar el trigger?
>
> O tendría que crear otro trigger solo para actualizar el campo Timestamp_mod
> de Recetas, pero, como le digo que se ejecute ANTES que este trigger?
>
> Como podría hacerlo?.
No hagas UPDATE a la tabla recetas en el trigger, solo necesitas
modificar los campos en el registro NEW... y el TRIGGER debe ser
BEFORE UPDATE
CREATE OR REPLACE FUNCTION funActualizaRecHist() RETURNS TRIGGER AS '
BEGIN
NEW.timestamp_mod = CURRENT_TIMESTAMP
INSERT INTO recetas_hist(cod_rec,ingredientes, dificultad,
tiempo,preparacion, iduser,
timestamp_alta, timestamp_mod)
VALUES (NEW.cod_rec, NEW.ingredientes, NEW.dificultad, NEW.tiempo,
NEW.preparacion, NEW.iduser, NEW.timestamp_alta,
NEW.timestamp_mod);
RETURN NEW;
END;
' LANGUAGE 'plpgsql';
CREATE TRIGGER trgActualizaRecHist BEFORE UPDATE ON recetas
FOR EACH ROW EXECUTE PROCEDURE funActualizaRecHist();
--
Atentamente,
Jaime Casanova
From | Date | Subject | |
---|---|---|---|
Next Message | Jaime Casanova | 2008-04-06 13:51:52 | Re: PostgreSQL 8.3.1 en FAT32 |
Previous Message | Juan Manuel Fernandez | 2008-04-06 05:13:33 | PostgreSQL 8.3.1 en FAT32 |