除了
触发器的再进入中列出的规则外,以下规则适用于指定为触发操作的 SPL 例程:
- 在只希望有一行的上下文中,SPL 例程不能是游标函数(返回多行的函数)。
- 在 SPL 例程中不能使用旧的或新的相关性名称,除非 CREATE FUNCTION 或 CREATE PROCEDURE 语句包含了将 UDR 定义为触发例程的
REFERENCING 子句。如果您需要在例程中使用相应的值,则必须将它们传递为参数。例程应答独立于触发器,且旧的或新的相关性名称在触发器外不具有任何意义。
- 触发器例程必须包含可以为触发器例程中 SPL 语句可以引用的 OLD 或 NEW 列值声明相关名称的 REFERENCING 子句。
- 触发例程必须包含指定本地数据库中的表或视图的名称的 FOR table_object
子句,其触发器可以调用此例程。该触发操作不能调用没有指定触发表或视图的触发器例程。
- 只有在 Triggered Action 列表的 FOR EACH ROW 部分中调用的触发器例程才能直接操作在触发器的或触发器例程的 REFERENCING
子句中定义的旧的或新的相关名称。
- 触发器例程只能在触发器定义中 Triggered Action 列表的 FOR EACH ROW 部分调用。
- OLD 或 NEW 值的相关变量可以出现在 SPL 的 IF 语句和 CASE 表达式中。
- 只有 NEW 值的相关变量可以在引用相关变量的 LET 表达式的左边。在这种情况中,SPL 例程的 FOR 子句必须指定表(而非视图),并且调用 SPL
例程的操作的触发器不能是 INSTEAD OF 触发器。
- OLD 和 NEW 值可以在 LET 表达式的右边。
- 只用 FOR EACH ROW 子句中调用的触发器例程可以使用 Boolean 运算符SELECTING 、INSERTING 、DELETING 和
UPDATING。如果触发事件符合由相同名称的运算符引用的 DM 操作,则返回 TRUE('t'),否则返回 FALSE('f')。
- SPL 的 IF 语句和 SQL 的 CASE 表达式可以指定这些运算符为触发例程中的条件。
- 触发器例程必须用 SPL 语句编写。它们不能使用外部语言编写,例如 C 或 Java™
语言,但是触发器例程可以包含外部语言的调用,例如用于触发器内省的 mi_trigger 应用程序接口。
- 触发器例程不能引用保存点。触发操作对数据值或数据库结构的更改必须整体提交或回滚。
GBase 8s
在触发器例程中不支持 ROLLBACK TO SAVEPOINT
语句用于触发操作的部分回滚。
有关 mi_trigger API 的更多信息,请参阅 GBase 8s DataBlade API 程序员指南 和 GBase 8s DataBlade API 函数参考 。
当您使用 SPL 例程作为触发操作时,除非执行该例程,否则例程引用的数据库对象不被检查。