【发布时间】:2017-01-27 06:08:10
【问题描述】:
如果至少有一个字段发生了更改,我想在更新发生后跟踪表上的更改并将它们存储在相应的历史表中。
我有以下表格:
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;
【问题讨论】:
标签: postgresql triggers