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;

-
Enviado a la lista de correo pgsql-es-ayuda ([email protected])
Para cambiar tu suscripción:
http://www.postgresql.org/mailpref/pgsql-es-ayuda

Responder a