Ver Mensaje Individual
  #1 (permalink)  
Antiguo 06/04/2008, 01:56
djorj
 
Fecha de Ingreso: junio-2007
Mensajes: 1
Antigüedad: 16 años, 10 meses
Puntos: 0
Problemas con recursividad en triggers

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