我遇到了一个有趣的情况,正在尝试进行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;


显然,它将因违反约束而失败,但是它也不会更改changed属性:

SQL> select * from t;

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


我的问题是:为什么会这样?我敢肯定我误解了一些基本概念,但我不明白。

在此先感谢您的帮助。

最佳答案

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

因此,触发时您什么都不做。
如果可以在这种方式下说,那个变量:new.changed在另一个会话中被“改变”。您的更新未更改。

10-04 11:22