触发器中的自主事务和约束违规

4

我遇到了一个有趣的情况,正在尝试使用自主事务。考虑以下情况(请注意,这不是打算这样编写的:只是概念证明):

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;

显然,由于约束违规,它将失败,但它也不会改变changed属性:

SQL> select * from t;

       ID CHANGED
--------- -----------------
        1 19.09.11 15:29:44
        2 19.09.11 15:32:35

我的问题是:为什么会发生这种情况?我确定我对一些基本概念有误解,但我无法理解这个想法。
提前感谢您的帮助。
1个回答

1

PRAGMA AUTONOMOUS TRANSACTION 保存上下文,打开另一个会话并执行某些操作。必须提交,否则更改将丢失。您可以理解,在数据库中某个块中进行的更改仅在此会话(自主)中有意义。

因此,在触发器中您什么也不做。如果我们可以这样说,那么该变量:new.changed是在另一个会话中“更改”的,对于您的更新而言它没有被更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接