[英]Postgresql 9.2 trigger to log changes to data in another table
我有几个表,想要记录何时对它们进行更改,更改的内容以及更改者。 Postgresql 9.2
CREATE TABLE unitsref (
unitsrefid serial primary key,
units varchar,
unitname varchar,
inuse boolean,
systemuse varchar,
keynotes integer,
linkid integer
);
是使用OLD的最佳做法。*从新的* DISTINCT。
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,
编写函数来执行此操作的最佳语法是什么? In 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中最好的方法
我只对三个领域感兴趣
那么在更改这些字段后仅调用触发器应该更有效:
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
......
一个布尔表达式,用于确定是否实际执行触发器功能。
请注意,这两个元素密切相关,但既不相互排斥也不冗余。
如果不涉及任何感兴趣的列,那么根本不触发触发器要便宜得多。
如果没有实际改变感兴趣的列,则执行触发器功能要便宜得多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.