postgresql - PostgreSQL:操作日志
问题描述
我需要确保在我的数据库中捕获所有数据修改(插入/更新/删除)。更大的图景,一个过程将读取每个修改并将该信息映射到特定的消息结构,然后将其添加到像 Kafka 这样的队列中。不过,我不确定最好的方法。这个答案提示使用test_decoding
插件。其他资源指向 WAL 和查询复制槽,但我不需要存档 WAL 或实际复制我的数据。我只需要记录该数据发生的所有事情。就像是:
SELECT * FROM operations_log;
> | query |
> | INSERT INTO users (id, name, bio) VALUES (1, 'pat', 'a person') |
> | UPDATE users SET name = 'Pat' WHERE id = 1 |
人们如何在 PostgreSQL 中管理这种需求?是否需要复制或 WAL 归档才能获得此好处?
解决方案
我通常使用表上的后触发器来解决这个问题,然后将旧行以及时间戳和任何其他相关信息插入另一个审计表中。
因此,以您的 users 表为例,我将创建一个 users_audit 表:
create table users_audit (
ts timestamptz default current_timestamp,
like users
);
然后是触发函数
create function users_audit_trigger() returns trigger
language plpgsql as $$
insert into users_audit values (current_timestamp, OLD.*);
$$
最后是真正的触发器......
create trigger users_audit_tg after update or delete on users
for each row execute procedure users_audit_trigger();
以上内容未经测试,您可能希望记录更多信息,例如执行更新的用户或更新或删除的实际操作,因此详细信息可能会有所不同。
您可以使用逻辑复制在不同的服务器上执行部分或全部此操作,但基本思想保持不变。
推荐阅读
- tensorflow2.0 - 使用张量输入求解张量流中的 ODE
- flutter - 迭代多个列表并将它们显示在颤动的列表图块中
- r - 合并和替换字符列
- html - 为什么代码从错误的站点读取 html?
- c# - 从包含 100 个文件的文件夹中随机选择 40 个文件
- windows - 找出 Powershell 标准输出重定向到的位置(而不是 cmd.exe)
- unity3d - 统一处理鼠标点击的正确方法是什么?
- pyspark - 如何在pyspark数据帧(时间序列)中计算每日基础
- python - Python 交互式窗口不断打开脚本或运行它
- javascript - 如何在具有 src 的标签中附加 thymeleaf 变量?