我想在postgresql中使用触发器执行审计表。
我的例子:
CREATE OR REPLACE FUNCTION fn_editorial_audit()
RETURNS trigger AS $$
BEGIN
IF (TG_OP = 'DELETE') THEN
INSERT INTO eidt_aud ("code", "name","action","user_id","timestamp")
VALUES (OLD, OLD, 'D', USER, now());
RETURN OLD;
ELSIF (TG_OP = 'UPDATE') THEN
INSERT INTO eidt_aud ("code", "name","action","user_id","timestamp")
VALUES (NEW, NEW, 'U', USER, now());
RETURN NEW;
ELSIF (TG_OP = 'INSERT') THEN
INSERT INTO eidt_aud ("code", "name","action","user_id","timestamp")
VALUES (NEW, NEW, 'I', USER, now());
RETURN NEW;
END IF;
RETURN NULL;
END;
$$ LANGUAGE 'plpgsql'; ;
CREATE TRIGGER tb_editorial_tg_audit AFTER INSERT OR UPDATE OR DELETE
ON tb_edit FOR EACH ROW EXECUTE PROCEDURE fn_edit_audit();
但我想做一些不同的事情: 我想在原始编辑表的数据中插入数据表中的行(如果它不存在),并且如果它已经存在,则在审计表中更新。要始终拥有最后一个州而不是每个州。
谢谢!
答案 0 :(得分:0)
那么为什么不将时间戳存储在实际的表本身上呢?
CREATE TABLE AS (... myAuditTimestamp timestamp);
或者,将列添加到预先存在的表
ALTER TABLE foo ADD COLUMN (myAuditTimestamp timestamp);
然后使用TRIGGER
到UPDATE
时间戳字段。然后审计字段始终最新的行数据,因为它实际上在行上。如果您沿着这条路走下去,甚至不必创建PROCEDURE
触发器来电,您可以使用SPI
moddatetime()
F.34.5。 moddatetime - 跟踪上次修改时间的函数
moddatetime()是一个触发器,用于将当前时间存储到时间戳字段中。这对于跟踪表中特定行的最后修改时间非常有用。要使用,请使用此功能创建BEFORE UPDATE触发器。指定单个触发器参数:要修改的列的名称。该列必须是timestamp类型或带时区的时间戳。 moddatetime.example中有一个例子。