REFERENCING 子句可以声明原始值的相关名称和 FOR 子句指定的 table_object 列中的已更改的值相关名称。
元素 |
描述 |
限制 |
语法 |
correlation
|
在此定义的触发器例程中限定旧的或新的列值(
correlation.column)
|
不能是 table_object |
标识符
|
owner
|
table_object 的所有者
|
必须拥有 table_object |
所有者名称
|
table_object
|
具有可以调用 function 的触发器的表或视图的名称或同义词
|
必须存在于本地数据库中 |
标识符
|
如果您在 CREATE FUNCTION 语句列表之后立即包含 REFERENCING 和 FOR table_object
子句,则您创建的函数被称为触发器函数(或 触发器 UDR 或 触发器例程)。 FOR 子句指定触发器可以从它们的 Triggered
Action 列表的 FOR EACH ROW 部分调用函数的表或视图。
在 REFERENCING 子句中,OLD
correlation指定一个前缀,通过该前缀触发器例程可以引用
table_object
列在触发器例程修改列值之前所具有的值。 NEW
correlation 指定用于引用触发器例程分配给该列的新值的前缀。无论该触发器例程是否能使用 correlation
名引用 OLD 列值,NEW 列值或者这两种类型的值都取决于正在触发事件的类型:
- 由 Insert 触发器调用的触发器例程仅能引用 NEW correlation 名称。
- 由 Delete 触发器或 Select 触发器调用的触发器例程仅能引用 OLD correlation 名称。
- 由 Update 触发器调用的触发器例程能引用 OLD 和 NEW correlation 名称。
有关如何在触发动作中使用
correlation.column 符号的信息,请参阅
REFERENCING 子句 。
除了任何以 SPL 语言编写
GBase 8s
UDR
的一般需求,触发器例程支持某些附加语法特性,并且受到一定的限制,对于不是触发器例程的一般 UDR ,它们不支持此功能(或者不受此限制):
- 触发器必须包含 FOR table_object 子句已指定本地数据库中表或视图的名称,该触发器可调用此例程。
- 触发器例程还可以包含 REFERENCING 子句以声明该相关名称为 OLD 和 NEW 值,它们可被 UDR 中的 SPL 语句引用。
- 触发器例程只能在触发器定义中的 Triggered Action 列表的 FOR EACH ROW 节被调用。
- OLD 或 NEW 值的相关变量可以出现在 SPL 的 IF 语句 和 CASE 表达式中。
- OLD 值的相关变量不能在一个 LET 表达式的左边。
- 如果 FOR 子句指定一个视图,它的 INSTEAD OF 触发动作列表调用该触发器例程,则 NEW 值的相关变量不能在一个 LET 表达式的左边。
- 只有 NEW 值的相关变量可以在引用相关变量的 LET 表达式的左边从而。然而,在这种情况下,FOR 子句必须指定表而非视图。
- 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 ,用于触发器内省。
- 触发器函数不能引用保存点。由触发动作引起的数据值或数据库结构变更必须被全部提交或全部回滚。
GBase 8s
不支持触发动作的部分回滚。
有关 mi_trigger API 的更多信息,请参阅 GBase 8s DataBlade API 程序员指南 和 GBase 8s DataBlade API 函数参考 。
如果您包含 REFERENCING 子句但省略了 FOR 子句,或者您包含 FOR 子句但省略了 REFERENCING 子句,则 CREATE FUNCTION
语句发生错误而失败。
如果您都省略了 REFERENCING 和 FOR 子句,则 UDR 不能使用 SELECTING 、INSERTING 、DELETING 和 UPDATING
运算符,并且不能声明可以表示和操纵触发器定义指定的表或视图上触发动作的列值。
有关 Delete 、Insert 、Select 和 Update 触发器的 REFERENCING 子句的语法的描述,请参阅 CREATE TRIGGER 语句中有关
REFERENCING 子句部分。