触发器

概述

由于对数据库的数据进行的某些操作(insert,update,delete,create,alter,drop)而引发对表名|视图名|用户模式|数据库进行的操作.

语法

Create [or replace] trigger 触发器名

[before|after|instead of] 触发事件

On 表名|视图名|用户模式|数据库

[for each row] [when 触发条件表达式]

Begin

语句

End;

说明:

a.触发事件如:insert,update,delete,create,alter,drop等操作.

b.before|after|instead of触发事件执行之前|之后|触发器为替代触发器

c.for each row表示行级触发器,对每行数据操作都会触发执行,若没有则表示无论操作多少数据都只触发一次.

触发器分类

1.行级触发器:对每一行数据操作都会引发触发器运行(比较典型的就是序列的应用)

create sequence seq_emp_id;

create table employee

(

eid varchar2(20) primary key,

ename varchar2(50) not null,

ebirth date,

elevel int

);

create or replace trigger tri_emp_id

before insert

on employee

for each row

begin

  select seq_emp_id.nextval

  into :new.eid

  from dual;

end;

关于:new新值标识符,:old原值标识符使用

:new|old.列名

新值标识符就是新增或修改的数据用于insert,update

原值标识符表示在对数据操作之前的值用于delete,update

 

2.语句级触发器:无论操作多少数据触发器都只执行一次

create or replace trigger tri_stu_log

after insert or update or delete

on student

--for each row加上这句就是行级触发器

declare

  ope varchar2(10);

begin

  if inserting then

    ope:='插入';

  elsif updating then

   ope:='修改';

  elsif deleting then

    ope:='删除';

  end if;

  DBMS_OUTPUT.put_line(ope);

  insert into stu_log

  values(ope,sysdate);

end;

此时删除多条数据只会触发一次

若将上面的语句加粗的for each row加上就是一个行级触发器,此时删除n条数据, 触发n

这些操作还可以针对特定的某一列的设置,updating(列名)此时,修改其他  列数据并不会触发触发器

 

3.替换触发器:定义在视图而不是表上的触发器,用来替换说使用实际语句的触发器

使用原因:直接对图进行操作可能会报错

create view view_emp_dep as

select eid,ename,ebirth,elevel,dname

from employee,department

where e_did=did;

 

insert into emp_dep values(3,'qww',sysdate,3,'yfb');

此时执行此操作会报错:ORA-01776: 无法通过联接视图修改多个基表

create or replace trigger tri_view_emp_dep_ins

instead of insert

on view_emp_dep

for each row

declare

  indid department%rowtype;

begin

  select * into indid from department where did=:new.did;

  if sql%notfound then

    insert into department(did,dname) values(:new.did,:new.dname);

  end if;

  insert into employee

  values(:new.eid,:new.ename,:new.ebirth,:new.elevel,:new.did);

end;

 

 

4.用户事件触发器:由事件引发的触发器

5.系统事件触发器:oracle系统的事件触发的触发器(如实例的启动,关闭).

 

posted @ 2015-10-19 22:42  爱上咖啡的唐  阅读(329)  评论(0编辑  收藏  举报