行级触发器
1触发器使用for each row选项
2行级触发器进行DML操作时,每作用一行就触发一次。
行级触发器分类
1before行级触发器
为了确保数据符合商业逻辑和企业规划,应该使用约束对输入数据加以限制。在某些情况下约束无法实现复杂的商业逻辑和企业规范,这时候可以使用before行级触发器
2after行级触发器
为了审计DMl操作,可以使用语句触发器或oracle系统提供的审计功能,为了审计数据的变化,应该使用after行级触发器
3限制行触发器
一般情况,行级触发器每作用一行就触发一次,而限制行触发器则是在特定的条件下才执行行触发器的代码。需要使用when字句对触发器条件加以限制.

举例

测试数据

create table student2(
sno varchar2(10) primary key,
sname varchar2(20),
sage number(2),
cno varchar2(2)
);
create table student2bei(
sno varchar2(10) primary key,
sname varchar2(20),
sage number(2),
cno varchar2(2)
);

insert into student2 values(‘1’,’lilia’,18,’1’);
insert into student2 values(‘2’,’lilib’,18,’1’);
这里写图片描述

测试
create or replace trigger FK_trigger
before update
on student2
for each row –行级触发器
begin
if :OLD.cno=:new.cno then
insert into student2bei values(:OLD.sno,:OLD.sname,:OLD.sage,:OLD.cno);
else
raise_application_error(-20002,’外键约束的值不能修改’);
end if;
end FK_trigger;

update student2 set cno=’2’ where sno=’1’;

update student2 set sname=’lilic’ where sno=’1’;

这里写图片描述
解释:
update student2 set cno=’2’ where sno=’1’;
根据触发器规则,cno有改动的话,报外键约束的值不能修改的错误
update student2 set sname=’lilic’ where sno=’1’;
根据触发器规则,cno没有改动的话,将修改前的数据插入备份表student2bei中。

针对某一个列的行级触发器
create or replace trigger FK_trigger
before update of cno
on student2
for each row –行级触发器
begin
if :OLD.cno=:new.cno then
insert into student2bei values(:OLD.sno,:OLD.sname,:OLD.sage,:OLD.cno);
else
raise_application_error(-20002,’外键约束的值不能修改’);
end if;
end FK_trigger;

before update of cno:触发事件时cno列发生update操作才触发

posted on 2017-05-25 11:31  2637282556  阅读(314)  评论(0编辑  收藏  举报