【发布时间】: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