【问题标题】:for each statement and for each row after triggers return value对于每个语句和触发器返回值之后的每一行
【发布时间】:2021-10-21 08:22:18
【问题描述】:

我正在使用 Plpgsql 语言在 Postgres 中学习触发器,但我不完全了解 for each 语句触发器和触发器函数后的每一行的工作原理。

在每行触发前有3个返回值:NEW表示要执行INSERT/UPDATE操作,OLD表示要执行DELETE操作,NULL表示不执行任何操作。

对于每个语句和触发器函数之后的每一行,唯一可能的返回值是 NULL,所以我的问题是:

-在每个语句触发器中,如何判断是否要对表执行INSERT/UPDATE/DELETE操作?

-在触发器之后的每一行中,如何判断是否要回滚?

【问题讨论】:

  • 如前所述,plpgsql trigger 此处已全部说明。
  • @AdrianKlaver 我阅读了该页面的文档,我写的问题是我不了解该页面的内容。
  • 相当直接:'触发的行级触发器 BEFORE 可以返回 null 以指示触发器管理器跳过该行的其余操作(即,不触发后续触发器,并且 INSERT/此行不会发生 UPDATE/DELETE)。和 ' AFTER 触发的行级触发器或 BEFORE 或 AFTER 触发的语句级触发器的返回值始终被忽略;它也可能为空。但是,这些类型的触发器中的任何一种仍可能通过引发错误来中止整个操作。'
  • @AdrianKlaver 谢谢,现在一切都清楚了,所以错误/异常用于处理触发器后的回滚和决定是否必须在触发器之前执行操作。
  • 在前触发器中不返回NULL 会跳过其中的操作和任何后续触发器。这不会引发错误或异常。

标签: postgresql triggers plpgsql


【解决方案1】:
  • 您不能指定要跳过语句级触发器中的数据修改

  • 在触发器中强制ROLLBACKRAISE 异常

【讨论】:

  • 谢谢!我有最后一个问题:如果您在触发器之前在语句级别引发异常,这是否意味着操作被中止?那会不会像跳过数据修改一样有效?
  • 是的。触发器始终与触发语句在同一个事务中运行,因此触发器中的错误将回滚两者。
猜你喜欢
  • 2019-08-12
  • 1970-01-01
  • 2014-10-14
  • 2018-09-17
  • 2019-09-21
  • 2013-08-16
  • 2021-12-06
相关资源
最近更新 更多