postgresql - 如何在 postgresql 中记录数据变化?

标签 postgresql postgresql-8.4 audit-trail

这个问题似乎与与该主题相关的其他一些问题可能重复。我发现了一些类似的问题(几年前有人问过一些问题,关于这个话题的讨论似乎快结束了)。但是我的问题没有找到可行的解决方案。我有一个包含大量表的数据库,其中包含大量数据。我需要记录存储在特定数据库表中的数据发生的每一个变化。

例如,我有一个用于存储员工详细信息的表。

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/

相关文章:

postgresql - 恢复 PostgreSQL 数据库时出现错误 "invalid byte sequence"

php - 您如何看待这种在 mysql 中记录更改并具有某种审计跟踪的方法

python - 如何在 SQLAlchemy 中使用子查询来生成移动平均线?

json - 展平来自 JSONB 字段的聚合键/值对?

postgresql - 选择按日期排序的唯一记录

python - 哪个高效,使用 sql 连接查询,还是使用 pandas 合并查询?

postgresql - 从函数返回结果集

sql - 如何将结果集转换为数组?

python - 在 Django 中获取 AuditTrail 数据的方法

sql - 比较 SQL Server 2008 中删除和插入的表