2016-09-19 106 views
1

如果至少有一個字段已更改,我想跟蹤表上的更改並將它們存儲在對應的歷史記錄表中發生更新後。PostgreSQL觸發如果其中一列已更改

我有以下表格:

tbl_employees

CREATE TABLE tbl_employees (
    id serial NOT NULL, 
    first_name character varying NOT NULL, 
    last_name character varying NOT NULL 
) 

tbl_employees_history

CREATE TABLE tbl_employees (
    id serial NOT NULL, 
    employee_id NOT NULL, 
    first_name character varying NOT NULL, 
    last_name character varying NOT NULL, 
    changed_on timestamp NOT NULL 
) 

功能

CREATE OR REPLACE FUNCTION log_employee_changes() RETURNS trigger as 
$BODY$ 
BEGIN 
    IF (NEW.last_name <> OLD.last_name) or (NEW.first_name <> OLD.first_name) THEN 
    INSERT INTO tbl_employee_history(employee_id,last_name, first_name,changed_on) 
    VALUES(OLD.id,OLD.last_name, OLD.first_name,now()); 
    END IF; 
RETURN NEW; 
END; 
$BODY$ 
LANGUAGE plpgsql; 

觸發

CREATE TRIGGER add_log 
BEFORE UPDATE ON tbl_employees 
FOR EACH ROW 
EXECUTE PROCEDURE log_employee_changes(); 

到目前爲止好,這件事情只是工作。但我想知道如果我有一個表可以說15列,並且如果其中一列已更改,我想保存歷史記錄。我是否必須一遍又一遍地重複每個字段的IF語句,或者是否有某種方法來檢查每一列?這樣我就可以在表格中添加一列,而無需忘記更改觸發器功能。

事情是這樣的:

CREATE OR REPLACE FUNCTION log_employee_changes() RETURNS trigger as 
$BODY$ 
BEGIN 
    IF ?????there is one change on whatever column????? THEN 
    INSERT INTO tbl_employee_history(employee_id,last_name, first_name,changed_on) 
    VALUES(OLD.id,OLD.last_name, OLD.first_name,now()); 
    END IF; 
RETURN NEW; 
END; 
$BODY$ 
LANGUAGE plpgsql; 

回答

1

您可以比較完整記錄:

if new <> old then ... 
+0

噢這很好,沒」不知道這是可能的!謝謝 – koala

1

我希望,這將有助於你:

CREATE OR REPLACE FUNCTION log_employee_changes() RETURNS trigger as 
$BODY$ 
BEGIN 
    IF OLD!=NEW THEN 
    INSERT INTO tbl_employee_history(employee_id,last_name, first_name,changed_on) 
    VALUES(OLD.id,OLD.last_name, OLD.first_name,now()); 
    END IF; 
RETURN NEW; 
END; 
$BODY$ 
LANGUAGE plpgsql; 
+0

我也嘗試過,並且也有效!但是<>或!=有沒有區別? – koala

+1

!=是<>的別名。 –