Postgresql 优化触发器以添加审核日志

Postgresql 优化触发器以添加审核日志,postgresql,Postgresql,我有一个本地数据库,它是生产数据库,所有操作都是实时进行的。我通过触发器将每个操作的日志存储在另一个数据库的审核日志表中。它基本上检查行的列中是否有任何更改,它将删除该行并再次添加(我认为这不是一个好方法,因为它应该简单地更新它,但由于某些原因,我需要删除并再次添加它) 有一些表正在快速执行操作,例如数据库中添加了100s。这会减慢将数据保存到审核日志表的过程。现在,如果触发器需要删除100行并再次添加100,则会明显影响性能,如果行数增加,则会进一步降低性能 解决这个问题的最佳实践应该是什么,

我有一个本地数据库,它是生产数据库,所有操作都是实时进行的。我通过触发器将每个操作的日志存储在另一个数据库的审核日志表中。它基本上检查行的列中是否有任何更改,它将删除该行并再次添加(我认为这不是一个好方法,因为它应该简单地更新它,但由于某些原因,我需要删除并再次添加它)

有一些表正在快速执行操作,例如数据库中添加了
100s
。这会减慢将数据保存到审核日志表的过程。现在,如果触发器需要删除
100
并再次添加
100
,则会明显影响性能,如果行数增加,则会进一步降低性能

解决这个问题的最佳实践应该是什么,我一直在研究
读取副本
外部数据包装器
,但是对于读取副本,它对于PostgreSQL来说只可读而不可写,我真的不知道外部数据包装器将如何帮助我,正如我的一位同事所建议的那样


希望有人能指引我正确的方向

Alog根据定义是仅追加。记录者不应修改或删除现有条目

审计日志也不例外。审核触发器应
为每个更改插入一个条目(但您希望定义“更改”)。他们不应
更新
删除
任何内容*

更改和相应的日志条目应写入同一事务中的同一数据库,以确保原子性/一致性;直接登录到远程数据库将始终为您留下一个窗口,在该窗口中,日志已提交,但更改未提交(反之亦然)

如果需要聚合这些日志条目并将它们推送到另一个数据库,那么应该从外部进程而不是触发器本身中执行。如果需要实时执行此操作,可以通过


*事实上,您应该
更新
/
删除插入日志的用户在审核表上的权限。此外,理想情况下,触发器应该是一个
安全定义器
函数,由在日志表上具有
插入
权限的特权用户拥有。不应授予连接到数据库的用户直接写入日志表的权限

这可以确保如果您的客户端应用程序受到破坏(无论是由于故障还是恶意用户,例如利用SQL注入漏洞),那么您的审核日志将保留其更改的所有内容的完整准确记录。

“它将删除该行并再次添加”-它到底在做什么,你能显示一下触发功能的代码吗?不清楚您为什么要这样做,或者为什么要更新审核日志。或者你为什么想要一个可写的复制品。你能告诉用户更多关于你的用例吗?