簡體   English   中英

Postgresql 9.2觸發器記錄對另一個表中數據的更改

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM