Oracle数据库中before触发与after触发的区别
2013-03-14 20:53
399 查看
之前看别人的解说,但就是理解不了before到底怎么触发到的,而且对里面的:new和:old的值一直区分不了,现在好不容易理清楚了,不一定对,纯属个人理解,我也找不到相关的资料,有找到的哥们儿望说分享一下哦。先来看代码,代码最能说明一切。
定义一个触发前的触发器:
再定义一个触发后的触发器:
接下来执行一句更新语句:
所有的都弄好了,最后就是分析结果了:
从图中可以看出,在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触发。
不知道大家有没有看懂,个人理解,勿喷。。。。。。大家一起交流学习分享啊。。。。。。。。
先创建一个表,为了测试,加入一行就可以。
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触发。
不知道大家有没有看懂,个人理解,勿喷。。。。。。大家一起交流学习分享啊。。。。。。。。
相关文章推荐
- [oracle] oracle触发器中的after和before有什么区别 , 语句级触发和行级触发有什么区别
- [oracle] oracle触发器中的after和before有什么区别 , 语句级触发和行级触发有什么区别
- form 触发器的层次Before、Override、after的区别
- CSS3伪类和伪元素的特性和区别尤其是 ::after和::before
- jquery的append、prepend、html、after、before 的总结和区别
- jquery after before append appendto prepend prependto的区别
- 触发器(二、BEFORE和AFTER的区别及使用场景)
- Jquery添加元素(append,prepend,after,before四种方法区别对比)
- 触发器里 after 和 before的区别
- spring AOP @Around @Before @After 区别
- mysql 触发器after与before的区别
- CSS3 ::before 和 :after中双冒号和单冒号 有什么区别?
- :before/:after和::before/::after的区别
- spring AOP @Around @Before @After 区别
- jquery中append、prepend, before和after方法的区别
- Jquery中的append()和preappend(),after()和before()的区别
- DELETE ARCHIVELOG ALL COMPLETED BEFORE/after 'SYSDATE-7'与DELETE ARCHIVELOG UNTIL TIME 'SYSDATE-7'区别
- spring AOP @Around @Before @After 区别
- css中的伪元素:before :after与jQuery中的.before .after的区别
- jquery中append、prepend, before和after方法的区别