REFERENCING 子句可以声明初始值的相关名,以及 FOR 子句指定的 table_object 列中更新的值。
元素 |
描述 |
限制 |
语法 |
correlation
|
在此声明的名称,用于在触发器例程中限定的旧的或新的列值(如
correlation.column)
|
不能是 table_object |
标识符
|
owner
|
table_object 的所有者
|
必须拥有 table_object |
所有者名称
|
table_object
|
其触发器可以调用此过程的表或视图的名称或同义词 |
必须在当前数据库中存在 |
标识符
|
如果在 REATE PROCEDURE 语句的参数列表后面包含 REFERENCING and FOR table_object
子句,那么您创建的例程为触发器过程(或触发器 UDR 或触发器例程)。FOR 子句指定表或视图的触发器可以从 Triggered
Action 列表的 FOR EACH ROW 部分调用例程。
在 REFERENCING 子句中,OLD
correlation 指定了一个前缀,通过该前缀,触发器例程可以引用在触发器例程修改该列之前
table_object 的列所具有的值。NEW
correlation
指定一个前缀,用于引用触发器例程分配给列的新值。触发器例程是否可以使用相关名称来引用 OLD 列值,NEW 列值或这两个列值取决于触发事件的类型:
- 由 Insert 触发器调用的触发器例程只能引用 NEW 相关名称。
- 由 Delete 触发器或 Select 触发器调用的触发器例程只能引用 OLD 相关名称。
- 由 Update 触发器调用的触发器例程可引用 OLD 和 NEW 相关名称。
有关在触发器操作中如何使用
correlation.column 表示法的更多信息,请参阅
REFERENCING 子句。
除了以 SPL 语言编写的
GBase 8s
UDR 的一般要求外,触发例程还可以支持某些附加的语法特性,并且受某些限制的约束,这些特性不是对于普通的(或不是限制)触发程序:
- 触发器例程必须包含 FOR table_object 子句,该子句指定本地数据库中的表或视图的名称,其触发器可以调用此例程。
- 触发器例程还可以包含 REFERENCING 子句以声明 UDR 中的 SPL 语句可以引用的 OLD 和 NEW 值。
- 触发器例程只能在触发器定义中触发器动作列表的 FOR EACH ROW 部分调用。
- OLD 或 NEW 值的相关变量可以出现在 SPL 和 CASE 表达式的 IF 语句中。
- OLD 值的相关变量不能位于 LET 表达式的左侧。
- 如果 FOR 子句指定了其 INSTEAD OF 触发器操作列表调用触发器例程的视图,那么 NEW 值的相关变量不能位于 LET 表达式的左侧。
- 只有 NEW 值的相关变量可以位于引用相关变量的 LET 表达式的左侧。在这种情况下,FOR 子句必须指定一个表而不是一个视图,并且其操作调用 SPL 例程的触发器不能是
INSTEAD OF 触发器。
- OLD 和 NEW 值都可以在 LET 表达式的右侧。
- Boolean 运算符 SELECTING 、INSERTING 、DELETING 和 UPDATING 在 Boolean
表达式有效的上下文中的触发例程中(并且仅在触发例程和触发动作语句中调用其它 UDR)有效。如果触发事件匹配由操作符的名称引用的 DML 操作,则这些运算符返回
TRUE('t'),否则返回 FALSE('f')。
- 如果单个触发事件在同一个表或视图上激活多个触发器,则所有 BEFORE 操作都将在任何 FOR EACH ROW 操作之前发生,并且所有 AFTER 操作在 FOR
EACH ROW 操作后发生。不保证同一事件上不同触发器的执行顺序。
- 触发器例程必须用 SPL 语言编写。它们不能用外部语言编写(如 C 或 Java™
语言),但是它们可包含对外部例程的调用。例如用于触发器内省的 mi_trigger 应用程序编程接口。
- 触发器例程不能引用保存点。触发操作对数据值或数据库模式的任何更改必须完全落实或回滚。不支持部分回滚触发的操作。
有关 mi_trigger API 的更多信息,请参阅 GBase 8s DataBlade API 程序员指南和 GBase 8s DataBlade API 函数参考。
如果包含 REFERENCING 子句但省略 FOR 子句,或者包含 FOR 子句但省略 REFERENCING 子句,那么 CREATE PROCEDURE
语句发生错误并失败。.
如果省略 REFERENCING and FOR 子句,则 UDR 不能使用 SELECTING 、INSERTING 、DELETING 和 UPDATING
运算符,并且不能在触发器定义指定的表或视图上声明可表示和操作触发动作中的列值的变量。
有关表上的 Delete 、Insert 、Select 和 Update 触发器的 REFERENCING 子句的语法以及 Delete 、Insert 、Select
和
Update 视图上的 INSTEAD OF 触发器的语法,请参阅 CREATE TRIGGER 语句说明中的 REFERENCING 子句 部分。