AFTER 操作
触发语句的操作完成后,指定的 AFTER 触发器操作执行一次。如果触发器语句不处理任何行,则 AFTER 触发器操作仍将执行。
多个触发器的操作
当 UPDATE 或 MERGE 语句激活多个触发器时,触发操作合并。假设 taba 具有列 a 、b 、c 和 d,如该示例所示:
CREATE TABLE taba (a INT, b INT, c INT, d INT);
接下来。假设您在列 a 和 c 上定义 trig1,在列 b 和 d 上定义 trig2 。如果两个触发器都指定BEFORE 、FOR EACH ROW 和 AFTER 操作,则按以下顺序执行触发器操作:
- 触发器的 BEFORE 操作列表(a 、 c)
- 触发器的 BEFORE 操作列表(b 、d)
- 触发器的 FOR EACH ROW 操作列表(a 、c)
- 触发器的 FOR EACH ROW 操作列表(b、 d)
- 触发器的 AFTER 操作列表(a 、 c)
- 触发器的 AFTER 操作列表(b 、 d)
数据库服务器将由同一个触发语句激活的所有触发器视为单个触发器。且触发操作是合并操作列表。控制触发器操作的所有规则适用于作为单个列表的合并列表,且两个原始触发器之间没有区别。
确保行顺序的独立性
在 FOR EACH ROW 触发操作列表中,结果可能取决于正在处理的行的顺序。通过以下建议,您可以确保结果是独立于行顺序的:
- 避免在 FOR EACH ROW 部分中选择触发表。
如果触发语句影响触发表中的多个行,则 FOR EACH ROW 部分中的 SELECT 语句的结果随着处理的每一行而变化。该条件也适用于任何级联触发器。请参阅级联触发器。
- 在 FOR EACH ROW 部分中,避免使用从触发表的当前行得到的值更新表。
如果触发操作多次修改表中的任何行,则该行的最终结果取决于触发表中行处理的顺序。
- 避免在同一个 FOR EACH ROW 触发操作(包括任何级联触发操作)中的另一个语句选择的 FOR EACH ROW 部分中修改表。
如果 FOR EACH ROW 操作修改表,则当触发器随后的操作引用表时,该更改可能不完整。在此情况中,结果可能不同,这取决于处理行的顺序。
数据库服务器不实施规则以避免这些情况,因此如果这样做或限制触发操作可以选择的表的集合。而且,大多数触发操作的结果是独立于行顺序的。因此,您负责确保触发操作的结果独立于行顺序。
REFERENCING 子句
任何事件的 REFERENCING 子句声明可以用于触发表中限定列值的相关名(对于 Update 触发器,两个相关名称)。这些名称启用 FOR EACH ROW 操作以引用触发事件结果中的新值。
它们还启用 FOR EACH ROW 操作以引用触发事件修改前触发表中存在的旧列值。
如果该触发操作同时包括了 INSERT 语句和 BEFORE WHEN 或 AFTER WHEN 关键字,则相关名无效。此限制对指定 FOR EACH ROW 关键字不含 BEFORE 或 AFTER 关键字或者不包含 INSERT 语句的触发操作没有影响。
此处为 CREATE TRIGGER 语句描述的 REFERENCING 子句语法在定义例程的 CREATE FUNCTION 和 CREATE PROCEDURE 语句中是可用的,它提供 CREATE FUNCTION 或 CREATE PROCEDURE 语句也包括 FOR table_object 子句以指定表或视图的 FOR EACH ROW 操作可以调用触发例程。
用于删除的 REFERENCING 子句
Delete 触发器的 REFERENCING 子句可以为列中要删除的值声明相关名称。
用于删除的 REFERENCING 子句
元素 | 描述 | 限制 | 语法 |
correlation | 此处为满足在触发器操作中使用的旧列值声明的名称( correlation.column) | 在此 CREATE TRIGGER 语句中必须唯一 | 标识符 |
correlation 是在触发语句执行前,用于触发表中列值的限定符。correlation 在 FOR EACH ROW 触发操作列表中的作用域中。请参阅相关的表操作。
要在触发操作中使用相关名称以引用旧的列值,请以相关名称和句号(.)作为列名的前缀。例如,如果 NEW correlation 是 post ,请将列 fname 的新值引用为 post.fname。
如果触发器事件是 DELETE 语句,则使用 new 相关名作为限定符会产生错误,因为咋i该行被删除后该列没有值。要了解控制使用相关名称的规则,请参阅在触发操作中使用相关名称。
只要您定义了 FOR EACH ROW 触发操作,就可以为删除使用 REFERENCING 子句。