PostgreSQL中数据库触发器的执行上下文

时间:2013-08-03 22:49:00

标签: sql postgresql triggers transactions

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

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

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

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

感谢您的投入!

1 个答案:

答案 0 :(得分:1)

  

根据我的理解,触发器在数据库中执行   独立于创建事件的客户端会话   导致触发器执行。那是对的吗?这意味着触发器   并且它们的处理不会影响客户端请求的性能   并且客户端可以随时关闭会话

它们完全不依赖于客户端会话,作为事务的一部分,它本身与会话相关联。 请参阅CREATE TRIGGER(9.1)的摘录:

  

可以在声明结尾处触发它们   触发事件,或在包含事务结束时;在里面   后一种情况他们被认为是延期

从你的other question看来你正在使用8.4,它没有延迟触发器,所以它更简单。触发器始终在语句的末尾(触发事件)运行,这意味着在服务器向服务器发送执行确认之前。

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