现在的位置: 首页 > 综合 > 正文

Oracle数据库中before触发与after触发的区别

2013年01月12日 ⁄ 综合 ⁄ 共 1251字 ⁄ 字号 评论关闭

之前看别人的解说,但就是理解不了before到底怎么触发到的,而且对里面的:new和:old的值一直区分不了,现在好不容易理清楚了,不一定对,纯属个人理解,我也找不到相关的资料,有找到的哥们儿望说分享一下哦。先来看代码,代码最能说明一切。

先创建一个表,为了测试,加入一行就可以。
create table emp(id number(5),ename varchar(10));
insert into emp values(100,'Tom');

定义一个触发前的触发器:

drop table emp_before_log;
create table emp_before_log(upd_time date,old_id number,old_ename varchar(10),new_id number,new_ename varchar(10));

CREATE OR REPLACE TRIGGER emp_tri BEFORE update ON emp
	FOR EACH ROW 
begin

	insert into emp_before_log values(sysdate,:old.id,:old.ename,:new.id,:new.ename);
	if :old.id>:new.id then
		:new.id := :old.id;
	end if;
	--里面不能提交,因为与emp的操作是同一事件,要用自治事务来区分开来
end;
/

再定义一个触发后的触发器:

drop table emp_after_log;
create table emp_after_log(upd_time date,old_id number,old_ename varchar(10),new_id number,new_ename varchar(10));

CREATE OR REPLACE TRIGGER emp_tri1 AFTER update ON emp
	FOR EACH ROW 
begin
	insert into emp_after_log values(sysdate,:old.id,:old.ename,:new.id,:new.ename);
end;
/

接下来执行一句更新语句:

update emp set id=10 where id=100;

所有的都弄好了,最后就是分析结果了:

从图中可以看出,在before时,:new.id是为10,也就是要更新的值,可是在经过if比较后,:new.id的值被更改为了100,原值:old.id也是100。到这儿后before触发结束,然后执行更新操作,也就是把100赋给100,结果还是没变。最后是执行after触发器,此时:new.id里面保存的值还是100,:old.id里面保存的值也是100,输出的结果就如上图所示。

 

给人的感觉就像 :new 与 :old 像两个变量一样,当出现更新时,把要更新的值传递给这两个变量,然后执行before触发,接下来是更新语句,最后是after触发。

 

不知道大家有没有看懂,个人理解,勿喷。。。。。。大家一起交流学习分享啊。。。。。。。。

 

 

 

 

 

 

 

 

抱歉!评论已关闭.