1

我有几张表,想记录对它们进行更改的时间、更改的内容以及更改的人员。PostgreSQL 9.2

CREATE TABLE unitsref (
unitsrefid serial primary key,
units varchar,
unitname varchar,
inuse boolean,
systemuse varchar,
keynotes integer,
linkid integer
);

使用 OLD.* IS DISTINCT FROM NEW.* 的最佳做法是什么?

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,

我想将这些更改记录在带有以下字段的表事件日志中:

recordtype varchar,
recordkey varchar,
changetype varchar,
personid integer,
changedate date,
changetime time,
changefrom varchar,
changeto varchar,

编写函数来执行此操作的最佳语法是什么?在进行中 Openedge 我会写

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 中的最佳方法

4

1 回答 1

4

我只对这三个领域真正感兴趣

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


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

UPDATE OF...

仅当列出的列中的至少一个列被提及为 UPDATE 命令的目标时,触发器才会触发。

WHEN...

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

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

  • 如果不涉及感兴趣的列,则根本不触发触发器要便宜得多。

  • 如果没有实际更改感兴趣的列,则不执行触发功能要便宜得多。

相关答案在这里这里...

于 2012-10-10T21:31:19.813 回答