2

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

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

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

我需要了解行为才能知道我想在另一个问题中做什么。

感谢您的输入!

4

1 回答 1

1

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

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

它们可以在导致触发事件的语句结束时触发,也可以在包含事务结束时触发;在后一种情况下,它们被称为延迟

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

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

于 2013-08-03T23:46:36.220 回答