Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » PostgreSQL »

Problemas con recursividad en triggers

Estas en el tema de Problemas con recursividad en triggers en el foro de PostgreSQL en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 06/04/2008, 01:56
 
Fecha de Ingreso: junio-2007
Mensajes: 1
Antigüedad: 17 años, 6 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
  #2 (permalink)  
Antiguo 07/04/2008, 01:28
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 10 meses
Puntos: 13
Re: Problemas con recursividad en triggers

uffff dale un repaso a como funcionan los triggers.

Crea un trigger BEFORE que poble las fechas de auditoria (creacion y modificacion). Pero no hagas un UPDATE dentro del trigger!!!! Repito dale un repaso a http://www.postgresql.org/docs/
Este trigger rellena la fecha de creacion o modificación segun sea un INSERT o un UPDATE, pero no tienes que hacer el INSERT ni el UPDATE dentro del trigger.

Luego creas otro trigger AFTER que "copia" en Recetas_historial.

Salu2
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:11.