oracle – 触发器和约束违规中的autonomous_transaction

我遇到了一个尝试使用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在另一个会话中被“更改”,如果我们可以在这种模式下说出来的话.您的更新不会更改.

相关文章

Java Oracle 结果集是Java语言中处理数据库查询结果的一种方...
Java AES和Oracle AES是现代加密技术中最常使用的两种AES加密...
Java是一种广泛应用的编程语言,具备可靠性、安全性、跨平台...
随着移动互联网的发展,抽奖活动成为了营销活动中不可或缺的...
Java和Oracle都是在计算机领域应用非常广泛的技术,他们经常...
Java 是一门非常流行的编程语言,它可以运行于各种操作系统上...