CREATE TRIGGER 命令定义将存储在数据库中的触发器并对其进行命名。
语法
定义新触发器
CREATE TRIGGER
概要
CREATE [ OR REPLACE ] TRIGGER name
{ BEFORE | AFTER | INSTEAD OF }
{ INSERT | UPDATE | DELETE }
[ OR { INSERT | UPDATE | DELETE } ] [, ...]
ON table
[ REFERENCING { OLD AS old | NEW AS new } ...]
[ FOR EACH ROW ]
[ WHEN condition ]
[ DECLARE
[ PRAGMA AUTONOMOUS_TRANSACTION; ]
declaration; [, ...] ]
BEGIN
statement; [, ...]
[ EXCEPTION
{ WHEN exception [ OR exception ] [...] THEN
statement; [, ...] } [, ...]
]
END
说明
CREATE TRIGGER 定义新触发器。CREATE OR REPLACE TRIGGER 将创建新触发器,或替换现有定义。
如果使用 CREATE TRIGGER 关键字创建新触发器,则新触发器的名称不得与同一表中定义的任何现有触发器匹配。新触发器将在与定义触发事件的表相同的 schema 中创建。
如果要更新现有触发器的定义,可使用 CREATE OR REPLACE TRIGGER 关键字。
当使用与 Oracle 数据库兼容的语法创建触发器时,触发器作为 SECURITY DEFINER 函数运行。
参数
参数 | 说明 |
---|---|
name | 要创建的触发器的名称。 |
BEFORE | AFTER | 确定是在触发事件之前还是之后触发触发器。 |
INSERT | UPDATE | DELETE | 定义触发事件。 |
table | 在其中发生触发事件的表的名称。 |
condition | condition 是 Boolean 表达式,确定是否实际执行触发器;如果 condition 的求值结果为 TRUE,则将触发触发器。
如果触发器定义包含 FOR EACH ROW 关键字,那么 WHEN 子句可以分别通过写入 OLD.column_name 或 NEW.column_name 来引用旧和/或新行值的列。INSERT 触发器无法引用 OLD,DELETE 触发器无法引用 NEW。 如果触发器包含 INSTEAD OF 关键字,则可能不会包含 WHEN 子句。 WHEN 子句不能包含子查询。 |
REFERENCING { OLD AS old | NEW AS new } ... | 用于引用旧行和新行的 REFERENCING 子句,但受到限制,因为 old 只能由名为 old 的标识符或以全小写形式保存的任何等效项替换(例如,REFERENCING
OLD AS old、REFERENCING OLD AS OLD 或 REFERENCING OLD AS "old")。此外,new 只能由名为 new 的标识符或以全小写的形式保存的任何等效项替换(例如,REFERENCING
NEW AS new、REFERENCING NEW AS NEW 或 REFERENCING NEW AS "new")。
可以在 REFERENCING 子句中指定以下两个短语或其中一个:OLD AS old 和 NEW AS new(例如,REFERENCING NEW AS New OLD AS Old)。 此子句与 Oracle 数据库不兼容,因为不能使用 old 或 new 之外的标识符。 |
FOR EACH ROW | 确定是应当为受触发事件影响的每一行触发一次触发器,还是只按每个 SQL 语句触发一次。如果指定,则为受影响的每一行触发一次触发器(行级触发器),否则触发器为语句级触发器。 |
PRAGMA AUTONOMOUS_TRANSACTION | PRAGMA AUTONOMOUS_TRANSACTION 是将触发器设置为自治事务的指令。 |
declaration | 变量、类型、REF CURSOR 或子程序声明。如果包括子程序声明,则它们必须在所有其他变量、类型和 REF CURSOR 声明之后。 |
statement | 一个 SPL 程序语句。请注意,DECLARE - BEGIN - END 块被视为 SPL 语句本身。因此,触发器主体可能包含嵌套块。 |
exception | 异常条件名称,如 NO_DATA_FOUND、OTHERS 等。 |