【发布时间】:2020-01-12 22:05:16
【问题描述】:
我正在使用触发器记录所有 UPDATE 和 INSERT 操作,但我的表有很多列,我想记录我更新了哪一列或插入及其新旧值。以下是我要实现的目标的演示:
big table
-------------------------
id |feild_1 | field_2| field_3 .....
-----------------------------------------------
usr1 |old_value1|
usr2 |old_value2|
假设我将 usr1 filed_1 中的值更改为“new_value1”。我想查看我的更改历史记录:
change history
-------------------------
id |field_changed | old_value | new_value |
-----------------------------------------------------------
usr1 |field_1 |old_value_1|new_value_1|
难点在于实现我修改的列名。 我使用的当前触发函数是从https://stackoverflow.com/a/49872254/5749562修改而来的。如下所示:
CREATE FUNCTION change_trigger() RETURNS trigger AS $$
BEGIN
IF TG_OP = 'INSERT'
THEN INSERT INTO change_history (
id, old_value, new_value
) VALUES (
OLD.id, row_to_json(OLD), row_to_json(NEW)
);
RETURN NEW;
ELSIF TG_OP = 'UPDATE'
THEN
INSERT INTO change_history (
id, old_value, new_value
)
VALUES (OLD.id, row_to_json(OLD), row_to_json(NEW));
RETURN NEW;
END IF;
END;
$$ LANGUAGE 'plpgsql' SECURITY DEFINER;
如您所见,所有列都在更改期间记录,这对于大表来说信息量不大。如何修改触发功能?
【问题讨论】:
-
你可以使用jsonb来计算“差异”,看这里:8kb.co.uk/blog/2015/01/19/…
标签: postgresql logging triggers