2013-08-03 101 views
1

我想使用触发器实现审计日志,触发器会在创建,更改和删除的数据上触发以存储一些值。这些触发器应该能够使用用户ID进行更改并由Web应用程序管理。我对提供这些数据有一些想法,但我似乎并没有完全理解触发器的执行上下文是什么。我读过PostgreSQL文档Overview of Trigger Behavior和其他人,但我的问题似乎没有得到回答。PostgreSQL中数据库触发器的执行上下文

我想知道的是客户端会话与一个正在运行的事务之间的交互以及触发器执行和两者的生命周期以及它们如何相互依赖。根据我的理解,触发器在数据库内独立于创建导致触发器执行的事件的客户端会话执行。那是对的吗?这意味着触发器及其处理不会影响客户端请求的性能,客户端可以随时关闭会话。如果两者都是独立的,那么触发器如何得到关于客户回滚事务的通知,这在逻辑上意味着根本没有数据被改变?或者触发器onyl在提交事务后执行,因为它们独立运行?

或者触发器是否在客户端会话中执行异步,从而创建导致触发器执行的事件?这意味着如果客户因任何原因关闭了会话,触发器也会中止。它们的更改直接绑定到客户端交易,并且可以回滚。

我需要了解行为以了解我想要在another question中做什么。

感谢您的输入!

+1

你看过现有的审计触发器实现吗? https://wiki.postgresql.org/wiki/Audit_trigger_91plus和 https://github.com/2ndQuadrant/audit-trigger – bma

+1

不,触发器不是独立的和异步的,触发器是事务的固有部分,它在用户会话中执行。如果在操作结束后(但在提交之前)发出回滚,则事务和trigerr所做的所有更改都将回滚。 – krokodilko

+0

@bma:不,我没有,谢谢你的链接。我无法使用新版本,因为我坚持8.4,但会看看旧的实现。 –

回答

1

从我的理解触发器在数据库 独立于客户端会话这创造 导致触发执行该事件中执行。那是对的吗?这将意味着触发器 和他们的处理不会影响客户端请求 的性能和客户可以在任何时间

没有他们完全依赖于客户端会话,作为交易的一部分关闭会话本身与会议挂钩。 查看来自CREATE TRIGGER这个片段(9.1):

它们可以在使 触发事件,或在含有事务结束的语句的末尾被解雇任;在 后一种情况下,他们被说成是推迟

从你other question看来你使用8.4,不具有延迟触发,因此它更简单。触发器始终在语句结束时(触发事件)运行,这意味着在服务器向客户端发送确认执行之前。

紧接着的一个COMMIT将是一个新的指令,并且在触发完成之前无法执行。

+0

谢谢,多数民众赞成清楚和简单。 :-)这意味着触发器可以完全访问我在事务中执行的所有事情,特别是创建临时表,其中包含与引起触发器执行的语句无关的数据,对吗?我的意思是创建一个临时表,插入一些数据,执行导致触发执行的语句,触发器可以访问以前插入的数据。 –