Re: Disparador que crea registros en una tabla para control de UPDATE y DELETE de otra tabla

From: Frank Alberto Rodriguez Solana <frankalberto(at)uci(dot)cu>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Disparador que crea registros en una tabla para control de UPDATE y DELETE de otra tabla
Date: 2014-09-08 12:50:25
Message-ID: 540DA611.9070705@uci.cu
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola Carlos, yo te recomiendo que separes los triggers 'control_log_historico' y 'control_log_dietario' y hagas dos funciones más pequeñas, una por cada trigger. Revisa no sea que cuando hagas un update en la tabla se disparen los dos triggers 'control_log_historico' y 'control_log_dietario' por eso te recomiendo que los separes en dos funciones distintas.

saludos

El 03/09/14 12:41, Carlos Joaniquet Tamburini escribió:



Buenas tardes,





Ante todo gracias a la comunidad, de la que he aprendido muchísimo con vuestras aportaciones.





Tengo el siguiente disparador en una tabla “historico” que se ha de activar cuando hay una modificación o borrado de un registro, para controlar qué y quien lo hace y registrarlo en una tabla “log_movimientos”. El problema es que cuando hay una modificación me crea 2 registros en el log: el primero con la información antes de la modificación en “concepto_old” y con la información modificada en “concepto_new” y el segundo registro (que no deseo que se inserte) con la información modificada tanto en “concepto_old” como en “concepto_new”.





Cuando hay un borrado me crea únicamente un registro: perfecto.





Lo que desearía es que únicamente se cree un solo registro (el primero) en los UPDATES.





A ver si podéis decirme qué hago mal.





Muchas gracias por vuestra atención y un saludo,





Carlos





P.D. Por si os es de utilidad, utilizo PostgreSQL 9.1.2 64 bits (y me va de maravilla





CREATE TRIGGER control_log_historico


AFTER UPDATE OR DELETE


ON historico


FOR EACH ROW


EXECUTE PROCEDURE control_log();











CREATE OR REPLACE FUNCTION control_log()


RETURNS trigger AS


$BODY$


DECLARE


fecha_ultimo_tramite DATE;


BEGIN


IF (TG_NAME = 'control_log_historico') THEN


IF (TG_OP = 'DELETE') THEN


INSERT INTO log_movimientos(


codi_registro, codi_asunto, creado,


concepto_old, tabla)


VALUES (old.codi_historico, old.codi_asunto, old.creado,


old.concepto, TG_TABLE_NAME);





ELSEIF (TG_OP = 'UPDATE') THEN


INSERT INTO log_movimientos(


codi_registro, codi_asunto, creado,


concepto_old, concepto_new, tabla)


VALUES (new.codi_historico, new.codi_asunto, old.creado,


old.concepto, new.concepto, TG_TABLE_NAME);





END IF;


ELSEIF (TG_NAME = 'control_log_dietario') THEN





IF (TG_OP = 'DELETE') THEN


INSERT INTO log_movimientos(


codi_registro, codi_asunto, creado,


concepto_old, tabla)


VALUES (old.codi_dietario, old.codi_asunto, old.creado,


old.concepto, TG_TABLE_NAME);





ELSEIF (TG_OP = 'UPDATE') THEN


INSERT INTO log_movimientos(


codi_registro, codi_asunto, creado,


concepto_old, concepto_new, tabla)


VALUES (new.codi_dietario, new.codi_asunto, old.creado,


old.fecha || ' ' || old.concepto, new.fecha || ' ' || new.concepto, TG_TABLE_NAME);





END IF;





END IF;








RETURN NEW;


END$BODY$


LANGUAGE plpgsql VOLATILE


COST 100;

Concurso "Mi selfie por los 5". Detalles en. Ver http://justiciaparaloscinco.wordpress.com

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Martín Marqués 2014-09-08 19:00:31 PgDay Argentina 2014
Previous Message jvenegasperu . 2014-09-08 01:50:19 Re: Disparador que crea registros en una tabla para control de UPDATE y DELETE de otra tabla