Postgresql 9.2触发器记录对另一个表中数据的更改

Postgresql 9.2触发器记录对另一个表中数据的更改,postgresql,stored-procedures,triggers,Postgresql,Stored Procedures,Triggers,我有几个表,希望记录对它们进行更改的时间、更改内容以及更改者。Postgresql 9.2 CREATE TABLE unitsref ( unitsrefid serial primary key, units varchar, unitname varchar, inuse boolean, systemuse varchar, keynotes integer, linkid integer ); 使用旧的。*和新的。*是不同的最佳做法吗 CREATE TRIGGER log_units

我有几个表,希望记录对它们进行更改的时间、更改内容以及更改者。Postgresql 9.2

CREATE TABLE unitsref (
unitsrefid serial primary key,
units varchar,
unitname varchar,
inuse boolean,
systemuse varchar,
keynotes integer,
linkid integer
);
使用旧的。*和新的。*是不同的最佳做法吗

CREATE TRIGGER log_unitsref
    AFTER UPDATE ON unitsref
    FOR EACH ROW
    WHEN (OLD.* IS DISTINCT FROM NEW.*)
EXECUTE PROCEDURE log_unitsref();
我只对三个领域感兴趣:

units varchar,
unitname varchar,
inuse boolean,
我想在带有以下字段的表eventlog中记录这些更改:

recordtype varchar,
recordkey varchar,
changetype varchar,
personid integer,
changedate date,
changetime time,
changefrom varchar,
changeto varchar,
编写函数以实现此目的的最佳语法是什么? 我会写的

create  EventLog.
assign  EventLog.PersonId    = glb-Personid
        EventLog.RecordType  = "UnitsRef"
        EventLog.RecordKey   = UnitsRef.Units
        EventLog.ChangeType  = "Create"
        EventLog.changeFrom  = ""
        EventLog.changeTo    = ""
        EventLog.changeDate  = today
        EventLog.changeTime  = time
但是我不知道Postgresql中最好的方法

我只对这三个领域感兴趣

那么,仅在更改这些字段后调用触发器应该更有效:


CREATE TRIGGER log_unitsref
AFTER UPDATE OF units, unitname, inuse
ON unitsref
FOR EACH ROW
WHEN (OLD.units, OLD.unitname, OLD.inuse) IS DISTINCT FROM
     (NEW.units, NEW.unitname, NEW.inuse)
EXECUTE PROCEDURE log_unitsref();
我引述:

更新

仅当至少列出了一列时,触发器才会触发 作为更新命令的目标提到

一个布尔表达式,用于确定触发器函数是否将 实际执行

请注意,这两个元素密切相关,但既不相互排斥也不冗余

如果不涉及利益相关者,那么根本不触发触发器的成本要低得多

如果没有实际更改感兴趣的列,则不执行触发器函数要便宜得多

相关答案或

我只对这三个领域感兴趣

那么,仅在更改这些字段后调用触发器应该更有效:


CREATE TRIGGER log_unitsref
AFTER UPDATE OF units, unitname, inuse
ON unitsref
FOR EACH ROW
WHEN (OLD.units, OLD.unitname, OLD.inuse) IS DISTINCT FROM
     (NEW.units, NEW.unitname, NEW.inuse)
EXECUTE PROCEDURE log_unitsref();
我引述:

更新

仅当至少列出了一列时,触发器才会触发 作为更新命令的目标提到

一个布尔表达式,用于确定触发器函数是否将 实际执行

请注意,这两个元素密切相关,但既不相互排斥也不冗余

如果不涉及利益相关者,那么根本不触发触发器的成本要低得多

如果没有实际更改感兴趣的列,则不执行触发器函数要便宜得多


相关答案或…

非常好,当表达非常有用时-我没有意识到这一点。我有大约20个表需要记录更改,所以我寻找了一个通用的解决方案。我找到了这个链接,我可能会使用它,并将表eventlog更改为使用表audit.logged\u操作。我还想知道如何将审计/事件日志保存在一个单独的模式中,因为这对我也有好处。当这个表达非常有用的时候,我不知道这一点。我有大约20个表需要记录更改,所以我寻找了一个通用的解决方案。我找到了这个链接,我可能会使用它,并将表eventlog更改为使用表audit.logged\u操作。我还想知道如何将审计/事件日志保存在一个单独的模式中,因为这对我也有好处。当做