>>>>行级触发器
>>>>语句级触发器
一、为什么要用触发器
跟踪并记录所有对雇员表的表结构进行改变的操作,如添加一列,修改列的类型、删除表等DDL操作,
要将这些操作存储到一个审计表中,以备以后查询。
1、分析:只要一变动表结构就要记录所有操作到一个审计表中。
2、触发器能够满足需求:
①不需要显式调用来执行,而是由一个事件来启动运行,即当某个事件发生时自动地隐式运行。例如,修改表结构操作隐式调用插入审计表的操作。
②触发器不能接收参数,所以可以通过其他Oracle事件来触发调用。
上述Oracle事件包括一下几种情况:
a、对数据库的表进行的insert,update,delete操作或对视图进行类似的操作。
b、执行DDL操作。
c、数据库的启动与关闭。
二、触发器的语法
CREATE [ OR REPLACE ] TRIGGER trigger_name
{ BEFORE / AFTER /INSTEAD OF }
{ INSERT / DELETE / UPDATE [ OF column1,column2..... ] }
[ OR { INSERT / DELETE / UPDATE [ OF column1,column2..... ] } ]
ON [ schema. ] table_or_view_name
[ REFERENCING [ NEW AS new_row_name ] [ OLD AS old_row_name ] ]
[ FOR EACH ROW ]
[ WHEN ( condition ) ]
[ DECLARE
variable_declation ]
BEGIN
statements;
[ EXCEPTION
exception_handlers ]
END [ trigger_name ] ;
语法里面:
>> BEFORE和AFTER:在事件发生之前或之后**触发器。
>> INSTEAD OF:如果使用此子句,表示可以执行触发器代码来代替导致触发器调用的事件。
>> INSERT / DELETE / UPDATE 指定构成触发器事件的数据操纵类型,UPDATE还可以指定列的列表。
>> REFERENCING:指定新行(即将更新)和旧行(更新前)的其他名称,默认为 NEW 和 OLD 。
>> table_or_view_name:要创建触发器的表或视图的名称。
>> FOR EACH ROW:指定是否对受影响的每行都执行触发器,即行级触发器,如果不使用此子句,则为语句级触发器。
>> WHEN :限制执行触发器的条件,该条件可以包括新旧数据值的检查。
>> DECLARE```END:一个标准的PL / SQL块。
实例:建立一个触发器,当scott.emp被删除一条记录时,把被删除记录写到删除日志里面去。
1、触发器语句
触发器语句是那些可以导致触发器的事件,即在表或视图上执行的 insert,delete,update之类的DML语句,在模式对象上执行的DDL语句或数据库事件。
在上面的实例中,下面的代码构成了触发器语句。
BEFORE DELETE
ON EMP
FOR EACH ROW
......
这说明,触发器会在这些事件之前隐式执行:当对emp表执行DELETE语句时,触发器将在受到影响的每一行上执行一次。
但是,触发器是否真正执行还要检查触发器限制条件,只有满足限制条件才会执行。
2、触发器限制
3、触发器操作
三、触发器的类型
(1)行级触发器
(2)语句级触发器
四、触发器的管理
(1)触发器的状态
(2)删除触发器
DROP TRIGGER 触发器名;
(3)触发器的选择
(4)DML触发器基本要点
(5)DML触发器的限制