oracle – 触发器和约束违规中的autonomous_transaction
发布时间:2021-01-13 10:30:24 所属栏目:站长百科 来源:网络整理
导读:我遇到了一个尝试使用autonomous_transaction的有趣情况.请考虑以下情况(请注意,这不是以这种方式编写的:只是概念证明): create table t(id int primary key,changed date)/create or replace trigger t_trigbefore insert or updateon tfor each rowdecla
我遇到了一个尝试使用autonomous_transaction的有趣情况.请考虑以下情况(请注意,这不是以这种方式编写的:只是概念证明): create table t ( id int primary key,changed date ) / create or replace trigger t_trig before insert or update on t for each row declare PRAGMA AUTONOMOUS_TRANSACTION; begin :new.changed := sysdate; commit; end; / insert into t(id,changed) values (1,sysdate); insert into t(id,changed) values (2,sysdate); 截至当前时间的更改日期: SQL> select * from t; ID CHANGED --------- ----------------- 1 19.09.11 15:29:44 2 19.09.11 15:32:35 让我们休息5秒,然后执行以下操作: update t set id = 2 where id = 1; 显然它会因约束违规而失败,但它也不会更改已更改的属性: SQL> select * from t; ID CHANGED --------- ----------------- 1 19.09.11 15:29:44 2 19.09.11 15:32:35 我的问题是:为什么会发生这种情况?我确信我误解了一些基本概念,但我无法理解. 在此先感谢您的帮助. 解决方法PRAGMA AUTONOMOUS TRANSACTION保存上下文,打开另一个会话并制作一些东西.提交是必须的,否则更改将丢失.您可以理解,只有在数据库中某些块中所做的更改才有意义(自治).所以,在你的触发器中你什么都不做.该变量:new.changed在另一个会话中被“更改”,如果我们可以在这种模式下说出来的话.您的更新不会更改. (编辑:揭阳站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐