触发器

定义:触发器是一种在发生数据库事件时自动运行的PL/SQL代码块,在一般情况下它与特定表上的DML操作相关联。

注意触发器与数据库中其他过程的区别,过程或函数都由用户直接调用,而触发器的执行用户则不能直接调用。Oracle会在相应的事件发生时,自动调用触发器。

 

1、DML触发器---DML触发器是在针对某个表进行DML操作时触发的

 1)语句级触发器
如果在创建触发器时未使用 for each row 子句,则该触发器为语句级触发器,该触发器在每个数据修改语句执行后只调用一次,而不管这一操作将影响到多少行。

 2)行级触发器
如果在创建触发器时使用 for each row 子句,则该触发器为行级触发器,当一个DML操作影响数据库中的多行数据时,对于每个数据行,行级触发器均会被触发一次。

 

:new  :old (仅用在于行级触发器)

1)如果DML是insertupdate的操作,则产生:new临时表,存储的值是DML操作插入或更改的新值。

2)如果DML是deleteupdate的操作,则产生: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时,不能在表上创建替代触发器)      

1DML触发器不同,在定义替代触发器后,用户对表的DML操作将不再被执行,而是执行触发器主体中的操作。

2如果一个视图由多个基表进行连接而成的,当这种操作是同时影响到2个基表以上时,视图不允许用户进行insert、update和delete的操作。如果我们要进行上述的操作,则必须将3DML操作定义在替代触发器中分别对各个基表进行操作。

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 触发器名

posted @ 2019-07-21 19:01  鹿小葵sr  阅读(382)  评论(0)    收藏  举报