【问题标题】:Postgresql 9.2 trigger to log changes to data in another tablePostgresql 9.2 触发器记录对另一个表中数据的更改
【发布时间】:2012-10-10 20:22:20
【问题描述】:

我有几个表,想记录对它们进行更改的时间、更改的内容以及更改的人员。 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 中最好的方法

【问题讨论】:

    标签: postgresql stored-procedures triggers


    【解决方案1】:

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

    那么在这些字段发生变化后只调用触发器应该会更高效:

    
    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();

    我引用the manual on CREATE TRIGGER:

    UPDATE OF ...

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

    WHEN ...

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

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

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

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

    相关答案herehere ...

    【讨论】:

    • Excellent WHEN 表达式非常有用——我没有意识到这一点。我有大约 20 个表需要记录更改,所以我寻找了一个通用的解决方案。我找到了这个链接,我可能会使用它并将表事件日志更改为按照链接使用 TABLE audit.logged_actions。我还想知道将审计/事件日志保存在单独的模式中,因为这对我也有好处。问候github.com/ringerc/scrapcode/blob/master/postgresql/audit.sql
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    相关资源
    最近更新 更多