【问题标题】:PostgreSQL trigger if one of the columns have changed如果其中一列已更改,则 PostgreSQL 触发器
【发布时间】: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


    【解决方案1】:

    您可以比较整个记录:

    if new <> old then ...
    

    if new is distinct from old then ...
    

    第二个选项更通用。仅当您确定记录不能包含空值时才使用第一个。

    【讨论】:

    • 哦,太好了,不知道这是可能的!谢谢
    【解决方案2】:

    希望对你有所帮助:

    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;
    

    【讨论】:

    • 我也试过了,也可以!但是 或 != 之间有什么区别吗?
    • != 是 . 的别名
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    相关资源
    最近更新 更多