oracle 触发器与commit的先后执行顺序

oracle11g

前些天朋友问了一个触发器的问题,引发了我进一步实验验证的想法:触发器与commit的先后顺序,以及触发器中的before、after是以哪个时间点划分的,rollback对触发器的影响。

相关代码

create table test (id number, name varchar2(64));

insert into test (id,name) values (1,'c');

commit;

create table res (res varchar2(64));

create or replace trigger test_tri_1 -- 命名

after insert -- 触发时机及触发事件

on test -- 在test触发

for each row -- 行级触发器

declare

str varchar2(100); -- 声明变量

pragma autonomous_transaction;

begin

select name into str from test where id=:new.id; -- 从test2表获取c2字段值

dbms_output.put_line(str);

insert into res values (str);

commit;

end;

insert into test (id,name) values (2,'y');

select * from test 、select * from res、delete from test where id=2

开启多个sql窗口,分别执行触发器的编译调整、insert语句、select等。

触发器与触发语句commit的先后顺序

创建触发器(before),执行insert,如下所示,test里查询不到新数据。

调整触发器(after),执行insert,test里查询不到新数据。

结论1:经验证,不论触发器是before还是after,触发器被触发执行完成时,触发触发器的dml语句都尚未真正提交(commit)入库入表。

触发器中before、after以什么划分

结论2:顺便说一句,网上有些说法是before是commit之前、after是commit之后,经过结论1的实验验证,这个说法不成立。

还有一种说法是before是触发事件前,after是触发事件后,before可以拿到触发发生前的旧数据,after拿不到。其实:new是新数据,:old是旧数据,都可以拿到,也实验验证确实能拿到(使用update触发事件验证),这种说法也不成立。

那么before、after到底是以哪个时间点划分的呢?待验证

触发语句rollback对触发器的影响

结论3:开启独立事务的情况下(即需要在触发器declare和begin之间加入关键词pragma autonomous_transaction),触发器代码中必须带commit(否则执行dml语句触发触发器时报错:ORA-06519: 检测到活动的独立的事务处理, 已经回退),则触发器中相关数据在触发触发器的dml语句commit前,就已经写入到了触发器数据的目标表中,即使dml语句被rollback,对这些数据也不影响。若不开启独立事务,则触发器代码中不能出现commit(否则在执行dml语句触发触发器时报错:ORA-04092: COMMIT 不能在触发器中),触发器代码与触发触发器的dml语句一起构成一个完整的事务,即要么一起commit,要么一起rollback。

相关推荐
阿狸猿18 分钟前
论 NoSQL 数据库技术及其应用
数据库·nosql
FBI HackerHarry浩25 分钟前
DataGrip2023.2.3默认保存的数据库和.sql文件在哪里?怎么修改默认路径?
数据库
袁小皮皮不皮27 分钟前
3.HCIP OSPF补充知识(优化版)
服务器·网络·数据库·网络协议·智能路由器
运筹vivo@36 分钟前
Python ContextVar 底层机制与内存模型拆解
前端·数据库·python
志栋智能1 小时前
超自动化巡检:知识沉淀与团队协作的新载体
大数据·运维·网络·数据库·人工智能·自动化
syt_biancheng1 小时前
Redis初识
数据库·redis·缓存
cmes_love2 小时前
股票逐笔level2历史行情下载十档订单薄五档tick分钟下载分享
数据库·区块链
仙俊红2 小时前
SQL 调优需要掌握的知识
数据库·sql
fofantasy3 小时前
NSK LH12AN 微型导轨技术手册
运维·网络·数据库·经验分享·规格说明书
杨运交3 小时前
[032][缓存模块]基于Redis Bitmap的用户行为统计实战:签到与日活分析
数据库·redis·缓存