【发布时间】:2013-08-04 23:21:03
【问题描述】:
我想使用触发器实现审核日志,该触发器会在创建、更改和删除的数据时触发以存储一些值。这些触发器应该能够使用进行更改并由 Web 应用程序管理的用户 ID。我对提供这些数据有一些想法,但我似乎并不完全理解触发器的执行上下文是什么。我已经阅读了 PostgreSQL 文档 Overview of Trigger Behavior 和其他文档,但我的问题似乎没有得到解答。
我想知道的是客户端会话与一个正在运行的事务与触发器执行之间的交互以及两者的生命周期以及它们如何相互依赖。据我了解,触发器是在数据库中独立于创建导致触发器执行的事件的客户端会话执行的。那是对的吗?这意味着触发器及其处理不会影响客户端请求的性能,并且客户端可以随时关闭会话。如果两者都是独立的,触发器将如何获得有关客户端回滚事务的通知,这在逻辑上意味着根本没有数据被更改?还是触发器 onyl 在提交事务后执行,因为它们独立运行?
或者触发器是否在创建导致触发器执行的事件的客户端会话中异步执行?这意味着如果客户端出于任何原因关闭它的会话,触发器也会中止。它们的更改直接绑定到客户端事务,也可以回滚。
我需要了解行为才能知道我想在another question 中做什么。
感谢您的意见!
【问题讨论】:
-
不,触发器不是独立和异步的,触发器是事务的固有部分,它在用户会话中执行。如果在操作结束后(但在提交之前)发出回滚,则事务和触发器所做的所有更改都将被回滚。
-
@bma:不,我没有,谢谢你的链接。我无法使用较新的版本,因为我坚持使用 8.4,但会看看较旧的实现。
-
我在wiki.postgresql.org/wiki/Audit_trigger 写了原版,但克雷格来重写了一个更好的版本。
标签: sql postgresql triggers transactions