如果至少有一個字段已更改,我想跟蹤表上的更改並將它們存儲在對應的歷史記錄表中發生更新後。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;
噢這很好,沒」不知道這是可能的!謝謝 – koala