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 Sonrisa
 
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

Responder a