【问题标题】:execution context of database trigger in PostgreSQLPostgreSQL中数据库触发器的执行上下文
【发布时间】:2013-08-04 23:21:03
【问题描述】:

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

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

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

我需要了解行为才能知道我想在another question 中做什么。

感谢您的意见!

【问题讨论】:

  • 您查看过现有的审计触发器实现吗? wiki.postgresql.org/wiki/Audit_trigger_91plusgithub.com/2ndQuadrant/audit-trigger
  • 不,触发器不是独立和异步的,触发器是事务的固有部分,它在用户会话中执行。如果在操作结束后(但在提交之前)发出回滚,则事务和触发器所做的所有更改都将被回滚。
  • @bma:不,我没有,谢谢你的链接。我无法使用较新的版本,因为我坚持使用 8.4,但会看看较旧的实现。
  • 我在wiki.postgresql.org/wiki/Audit_trigger 写了原版,但克雷格来重写了一个更好的版本。

标签: sql postgresql triggers transactions


【解决方案1】:

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

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

它们可以在导致 触发事件,或在包含事务结束时;在里面 后一种情况,它们被称为延迟

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

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

【讨论】:

  • 谢谢,简单明了。 :-) 这意味着触发器可以完全访问我在事务中所做的一切,尤其是创建的临时表与导致触发器执行的语句无关,对吗?我的意思是创建一个临时表,插入一些数据,执行导致触发器执行的语句,并且触发器可以访问以前插入的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-27
  • 1970-01-01
  • 2011-03-10
相关资源
最近更新 更多