Problemas con recursividad en triggers

From: "Jorge Herrera Roures" <jherreraroures(at)gmail(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org(dot)
Subject: Problemas con recursividad en triggers
Date: 2008-04-05 09:28:31
Message-ID: e205a460804050228l48164051wd66039d4f27499dc@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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.

CREATE OR REPLACE FUNCTION funActualizaRecHist() RETURNS TRIGGER AS '
BEGIN

UPDATE recetas
SET timestamp_mod = CURRENT_TIMESTAMP
WHERE cod_rec = NEW.cod_rec;

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
AFTER UPDATE ON recetas
FOR EACH ROW
EXECUTE PROCEDURE funActualizaRecHist();

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

Gracias

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message JGuillaume (ioguix) de Rorthais 2008-04-05 10:35:04 Re: RV: instalacion del PHPPGADMIN
Previous Message Jaime Casanova 2008-04-05 03:37:40 Re: mejorar el rendimiento postgres 8.2.* en windows