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;