创建DML触发器
create or replace trigger trigger_name
before | after --指定触发器在出发时间之前还是之后触发
insert on scott.table_name --指定触发事件,可以是insert,update,delete,也可是他们的组合,用or相连,
如:insert or update or delete.如果使用update,还可以在其后指定列,如:update of ename,job
[for each row] --指定行级触发,也即针对每一行的操作都会触发。如果不指定该选项则为语句级,即只触发一次,不论对多少行进行了操作
[referencing new as new_name old as old_name]--修改伪记录new和old的名称
[when (....)] --指定触发条件
[declare --指定声明部分
[pragma autonomous_transaction] --指定自主事务
....]
begin --可执行部分,至少一个可执行语句
....
[exception --异常处理部分
...]
end [trigger_name];
说明:1、关于when
(1)when条件针对行级触发器
(2)when后面的条件用括号()括起来,如果有多个条件可以用not,and,or相连,每个条件都必须在括号内。
(3)如果在when条件中使用伪记录new或者old,不需要在其前使用:,也即之间使用new或者old
(4)可以在条件中函数,但只能是oracle内置sql函数,不能使用户自定义函数,也不能是oracle内置包中的函数。
2、关于伪记录
(1)new和old两个伪记录都有rowid,且相同
(2)可以修改new的字段值,但只能在before 行级触发器。不能修改old的字段值
(3)不能把old和new作为记录参数传递
(4)不能对new和old执行记录级别操作,只能针对其中的字段。
3、关于操作指令
(1)三个操作指令:inserting,updating,deleting
(2)使用判断执行的操作为insert、update还是delete,他们的结果为boolen值。
(3)如果是updating,其后可以加列,比如:if updating(column_name) then....