这个问题似乎与与该主题相关的其他一些问题可能重复。我发现了一些类似的问题(几年前有人问过一些问题,关于这个话题的讨论似乎快结束了)。但是我的问题没有找到可行的解决方案。我有一个包含大量表的数据库,其中包含大量数据。我需要记录存储在特定数据库表中的数据发生的每一个变化。
例如,我有一个用于存储员工详细信息的表。
id employeename
1 ab
并且,此数据更改为
id employeename
1 cd
所以我需要记录这些数据。
即员工姓名
ab
改为
cd
在表中员工详细信息
每次对表中存储的内容进行更改时,我都需要记录数据。真的可能吗?如果是这样,我该怎么做?其中涉及哪些步骤?在这种情况下,我非常担心日志文件的大小。在这种情况下,什么是好的选择?我正在使用 postgresql8.4。任何好的建议都会对我有很大帮助。提前致谢。
最佳答案
非常通用的触发函数,可在此处找到:https://www.cybertec-postgresql.com/en/tracking-changes-in-postgresql/
存储历史的表:
CREATE SCHEMA logging;
CREATE TABLE logging.t_history (
id serial,
tstamp timestamp DEFAULT now(),
schemaname text,
tabname text,
operation text,
who text DEFAULT current_user,
new_val json,
old_val json
);
触发器:
CREATE FUNCTION change_trigger() RETURNS trigger AS $$
BEGIN
IF TG_OP = 'INSERT'
THEN INSERT INTO logging.t_history (
tabname, schemaname, operation, new_val
) VALUES (
TG_RELNAME, TG_TABLE_SCHEMA, TG_OP, row_to_json(NEW)
);
RETURN NEW;
ELSIF TG_OP = 'UPDATE'
THEN
INSERT INTO logging.t_history (
tabname, schemaname, operation, new_val, old_val
)
VALUES (TG_RELNAME, TG_TABLE_SCHEMA, TG_OP, row_to_json(NEW), row_to_json(OLD));
RETURN NEW;
ELSIF TG_OP = 'DELETE'
THEN
INSERT INTO logging.t_history
(tabname, schemaname, operation, old_val)
VALUES (
TG_RELNAME, TG_TABLE_SCHEMA, TG_OP, row_to_json(OLD)
);
RETURN OLD;
END IF;
END;
$$ LANGUAGE 'plpgsql' SECURITY DEFINER;
应用触发器:
CREATE TRIGGER t BEFORE INSERT OR UPDATE OR DELETE ON your_table
FOR EACH ROW EXECUTE PROCEDURE change_trigger();
关于postgresql - 如何在 postgresql 中记录数据变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13785855/