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

PostgreSQL中数据库触发器的执行上下文,sql,postgresql,triggers,transactions,Sql,Postgresql,Triggers,Transactions,我想使用触发器实现一个审计日志,该触发器在创建、更改和删除数据时触发,以存储一些值。这些触发器应该能够使用进行更改并由web应用程序管理的用户ID。我对提供这些数据有一些想法,但我似乎不完全理解触发器的执行上下文是什么。我已经阅读了PostgreSQL文档和其他文档,但我的问题似乎没有得到回答 我想知道的是客户端会话与一个正在运行的事务和触发器执行之间的交互,以及两者的生存期,以及它们如何相互依赖。据我所知,触发器在数据库中独立于创建导致触发器执行的事件的客户端会话执行。对吗?这意味着触发器及其

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

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

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

我需要了解这种行为,才能知道我想做什么

谢谢你的意见

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

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

它们可以在导致错误的语句末尾激发 触发事件,或在包含交易的末尾;在 在后一种情况下,它们被称为延期

从您的应用程序来看,您使用的是8.4,它没有延迟触发器,因此更简单。触发器总是在语句末尾(触发事件)运行,这意味着在服务器向客户端发送执行确认之前


紧跟其后的提交将是一条新指令,在触发器完成之前无法执行。

您看过现有的审核触发器实现吗?不,触发器不是独立的和异步的,触发器是事务的固有部分,在用户会话中执行。如果在操作结束后(但在提交之前)发出回滚,则事务和触发器所做的所有更改都将回滚。@bma:没有,谢谢链接。我不能使用更新的版本,因为我坚持使用8.4,但会看看旧的实现。我在上写了原始版本,但Craig来了,并重写了一个更好的版本。谢谢,这很清楚,很简单。:-)这意味着触发器可以完全访问我在事务中所做的一切,特别是创建的临时表,其中包含导致触发器执行的语句的非相关数据,对吗?我的意思是创建一个临时表,插入一些数据,执行导致触发器执行的语句,触发器可以访问以前插入的数据。