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



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

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

解决这个问题的最佳实践应该是什么,我一直在研究Read ReplicaForeign Data Wrapper,但至于只读副本,它对于 PostgreSQL 来说只是可读的,不能写,我真的不知道外部数据包装器将如何帮助我,因为我的一位同事建议了这一点。

希望有人能引导我朝着正确的方向前进。

根据定义,日志追加。记录器不应修改或删除现有条目。

审核日志也不例外。审核触发器应为每个更改INSERT一个条目(但要定义"更改"(。他们永远不应该UPDATEDELETE任何东西*。

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

如果需要聚合这些日志条目并将它们推送到其他数据库,则应从外部进程执行此操作,而不是在触发器本身内执行此操作。如果您需要实时执行此操作,您可以通过通知渠道通知流程新的更改。


* 实际上,您应该从插入日志的用户撤消对审计表的UPDATE/DELETE权限。此外,理想情况下,触发器应该是对日志表具有INSERT权限的特权用户拥有的SECURITY DEFINER函数。不应向连接到数据库的用户授予直接写入日志表的权限。

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

最新更新