PostgreSQL:操作日志记录

时间:2018-04-30 23:02:00

标签: postgresql

我需要确保在我的数据库中捕获所有数据修改(插入/更新/删除)。更大的图片,一个过程将读取每个修改并将该信息映射到特定的消息结构,然后将其添加到像Kafka这样的队列中。我不确定最好的方法。 This answer提示您使用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归档才能获得此优势?

1 个答案:

答案 0 :(得分:-1)

我通常在表上使用after触发器解决此问题,然后将旧行以及时间戳和任何其他相关信息插入到另一个审计表中。

因此,以您的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();

以上是未经测试的,您可能需要记录更多信息, 例如用户正在进行更新或实际操作 更新或删除,因此细节可能会有所不同。

您可以使用逻辑复制在其他方面执行部分或全部操作 服务器,但基本思想保持不变。

相关问题