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

From: "Carlos Joaniquet Tamburini" <carlos(at)joaniquet-tamburini(dot)es>
To: <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Disparador que crea registros en una tabla para control de UPDATE y DELETE de otra tabla
Date: 2014-09-03 16:41:59
Message-ID: 25DE85DBD09B47D49A68FC3C12A4BF40@SERVIDOR2
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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;

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Rusel Fichi 2014-09-03 17:59:05 Obtener diccionario de datos de todas las tablas y la entidad relacion de tablas en distintos esquemas
Previous Message Sergio Valdes Hurtado 2014-09-03 14:45:59 Re: Curso "PostgreSQL Advanced Development & Performance"