触发器
定义:触发器是一种在发生数据库事件时自动运行的PL/SQL代码块,在一般情况下它与特定表上的DML操作相关联。
(注意触发器与数据库中其他过程的区别,过程或函数都由用户直接调用,而触发器的执行用户则不能直接调用。Oracle会在相应的事件发生时,自动调用触发器。)
1、DML触发器---DML触发器是在针对某个表进行DML操作时触发的
(1)语句级触发器
如果在创建触发器时未使用 for each row 子句,则该触发器为语句级触发器,该触发器在每个数据修改语句执行后只调用一次,而不管这一操作将影响到多少行。
(2)行级触发器
如果在创建触发器时使用 for each row 子句,则该触发器为行级触发器,当一个DML操作影响数据库中的多行数据时,对于每个数据行,行级触发器均会被触发一次。
:new 和 :old (仅用在于行级触发器)
(1)如果DML是insert或update的操作,则产生:new临时表,存储的值是DML操作插入或更改的新值。
(2)如果DML是delete或update的操作,则产生:old临时表,存储的值是DML操作删除或更改以前的值。
例题:创建一个触发器,该触发器实现当部门表中的部门编号发生变化时,员工表中的部门编号也作相应更改。
例如当部门表中部门编号20被更改为80,则通过触发器把员工表中的所有部门编号为20也相应更改为80。
create or replace trigger t_a
after update on dept
for each row
begin
update emp set deptno =:new.deptno where deptno=:old.deptno;
end;
update dept set deptno=80 where deptno=20;
select * from emp
rollback;
例题:当部门被撤销时,将所有员工调入40 部门
create or replace trigger t_b
before delete on dept
for each row
begin
update emp set deptno=40 where deptno=:old.deptno;
end;
delete from dept where deptno=20;
2、替代触发器 (使用Oracle10G时,不能在表上创建替代触发器)
(1)与DML触发器不同,在定义替代触发器后,用户对表的DML操作将不再被执行,而是执行触发器主体中的操作。
(2)如果一个视图由多个基表进行连接而成的,当这种操作是同时影响到2个基表以上时,视图不允许用户进行insert、update和delete的操作。如果我们要进行上述的操作,则必须将(3)DML操作定义在替代触发器中分别对各个基表进行操作。
(3)使用DML触发器一般是定义在表上,而替代触发器一般是定义在视图上
2、系统级触发器
系统事件触发器是指由数据库系统事件触发的数据库触发器。数据库系统事件包括如下几种:
(1)数据库的启动(startup)
(2)数据库的关闭(shutdown)
(3)数据库服务器的出错(servererror)
注意:系统事件触发器不是与特定的表或视图关联。
例题:创建一个系统事件触发器,记录系统每次的启动时间(在sys下创建)
create table database_log(op_date timestamp);
create or replace trigger database_startup
after startup
on database
begin
insert into database_log values(sysdate);
end;
3、用户事件触发器
用户事件触发器是指与数据库定义语句DDL或用户登录/注销等事件相关的触发器,并且可以规定触发时间before和after:
只可以指定触发时间before的用户事件: logoff ---退出用户
只可以指定触发时间after的用户事件:logon ------登录用户
例题:创建一个用户事件触发器,记录用户登录系统的用户名与时间(只记录当前用户登录信息)
create table login(who varchar2(20),log timestamp);
create or replace trigger tr_log
after logon
on schema
begin
insert into login values(user,sysdate);
end;
4、alter trigger 语句用来重新编译、启用或禁用触发器。如果在触发器内调用了函数或过程,则当这些函数或过程被删除或修改后,触发器的状态将被标识为无效INVALID。
5、删除触发器:
drop trigger 触发器名

浙公网安备 33010602011771号