ORACLE数据库--触发器

       介绍:触发器在数据库里以独立的对象存储,它与存储过程不同的是,存储过程通过其它程序来启动运行或直接启动运行,而触发器是由一个事件来启动运行。即触发器是当某个事件发生时自动地隐式运行。并且,触发器不能接收参数。所以运行触发器就叫触发或点火(firing)。ORACLE事件指的是对数据库的表进行的INSERT、UPDATE及DELETE操作或对视图进行类似的操作。ORACLE将触发器的功能扩展到了触发ORACLE,如数据库的启动与关闭等。

       触发器的组成:

触发事件:即在何种情况下触发TRIGGER; 例如:INSERT, UPDATE, DELETE。

触发时间:即该TRIGGER 是在触发事件发生之前(BEFORE)还是之后(AFTER)触发,也就是触发事件和该TRIGGER 的操作顺序。

触发器本身:即该TRIGGER 被触发之后的目的和意图,正是触发器本身要做的事情。 例如:PL/SQL 块。

触发频率:说明触发器内定义的动作被执行的次数。即语句级(STATEMENT)触发器和行级(ROW)触发器。

语句级(STATEMENT)触发器:是指当某触发事件发生时,该触发器只执行一次;

  行级(ROW)触发器:是指当某触发事件发生时,对受到该操作影响的每一行数据,触发器都单独 

创建触发器

创建触发器的一般语法是 :

  CREATE [OR REPLACE] TRIGGER trigger_name

  {BEFORE | AFTER }

  {INSERT | DELETE | UPDATE [OF column [, column …]]}

  ON [schema.] table_name

  [REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]

  [FOR EACH ROW ]

  [WHEN condition]

  trigger_body;

下面我就用ORACLE数据库自带的SCOTT用户的DEPT表做一个案例供大家参考:

做这个案例之前复制一个与DEPT表结构一样的表,我们命名为COPY_DEPT

--复制表结构的同时复制表中的数据--
create table copy_dept as select * from dept where 1=1;
--复制表结构但不复制表中的数据--
create table copy_dept as select * from dept where 1=1;

我的触发器:

create or replace trigger test_triggger
after insert or delete or update on dept
for each row
begin
    if inserting then 
    insert into  copy_dept values (:new.deptno,:new.dname,:new.loc);
   elsif deleting then
     delete from copy_dept where deptno=:old.deptno;
   else
     update copy_dept set deptno=:new.deptno,dname=:new.dname,loc=:new.loc
     where deptno=:old.deptno;
   end if;
end;

--测试数据--

insert into DEPT values(50,'张三','金融部');
delete from dept where deptno=50;
update dept set dname='赵日天',loc='北京' where deptno=50;

其中test_trigger是该触发器的名字,for each now 表示该触发器是一个行级触发器,new表示新值 old表示旧值

--删除触发器--
drop trigger trigger_name;

行一次。

猜你喜欢

转载自blog.csdn.net/Websphere_zxf/article/details/84317505