触发器
概述
由于对数据库的数据进行的某些操作(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系统的事件触发的触发器(如实例的启动,关闭).