Re: Problemas con recursividad en triggers

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

In response to

Browse pgsql-es-ayuda by date

  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