DML触发器
DML触发器:是一种用在 表 上的触发器,通常在 insert,Update, delete语句上应用。
如果触发器仅影响一行,则触发器执行顺序:
(1)before 语句触发器
(2)before 行级触发器
(3)执行 DML语句
(4)after 行级触发器
(5)after 语句触发器
如果触发器影响多行,则触发器执行顺序:
(1)before语句触发器
(2)被影响的第一行的before行触发器
(3)第一行执行DML语句
(4)第一行的after行级触发器
(5)被影响的第二行的before行触发器
(6)第二行执行DML语句
(7)第二行的after行级触发器
(8)after语句触发器
语法:
1 create or replace trigger [schema.]trigger_name 2 {before | after} {delete | insert | {update [of column_list]}} on [schema.]table --触发时机 3 [referencing {OLD as old_name} | {NEW as new_name} | {Parent as parent_name}] --定义OLD、NEW的别名 4 [For each row] --行级触发器 or 语句级 5 [When (condition)] --触发器被触发后,是否执行触发体代码的条件 6 plsql_clock | call_procedure_statement
其中,(1)before | after:指定触发器是在对表的操作发生之前触发还是之后触发。
可以同时指定多个动作,
1 before delete or insert or update on tb_test
在使用Update作为触发行为时,还可以使用 Update of 指定一个或多个字段,仅在这些字段被更新时才会触发:
1 before update of column1, column2 ON tb_test
(2)when condition : 只有满足when指定的条件,才会执行触发体中的代码。在when子句中,可以使用以下几个谓词:
OLD 谓词:执行前的字段的值的名称,比如 Update一个表时,使用 OLD.column1 是指执行Update操作之前的列的值。
NEW 谓词:执行后的字段的值的名称,比如 Update一个表时,使用 NEW.column1是指执行 Update操作之后的列的值。
在触发器内部使用NEW和OLD谓词时,要在前面加上 :冒号,在WHEN子句中,可以不加上冒号。
(3)可以在触发器体的语句块中使用 INSERTING、UPDATING、DELETING谓词,这些谓词会返回相应的DML操作的布尔值,
如果为TRUE,则表示执行了相应的 INSERT、UPDATE、DELETE操作。
eg:
create or replace trigger tr_emp_test before insert or update or delete ON employee referencing old as old_name new as new_name for each row when(new_name.emp_name > old_name.emp_name) DECLARE v_sal number; begin if deleting then null; end if; end;