2010-01-05 71 views
1

触发我有一个复合触发器,并在之后的语句我有一个更新到其他表也具有复合触发器,如下面的代码:化合物在Oracle

create or replace 
trigger TRIGGER 
for insert or update on TABLE 
COMPOUND trigger 

after STATEMENT is 
begin 
    update THEOTHERTABLE set VALUE = VALUE + 1 where COD = 1; 
end after STATEMENT; 
end; 

更新只是一个简单的一个看是否有用。我希望它在THEOTHERTABLE上触发触发器,但只有触发器不复合时才会触发。

这是Oracle复合触发器的问题,还是仅仅是我不了解的功能?

+0

是什么在THEOTHERTABLE触发什么样子的? – 2010-01-07 01:31:59

+0

这是一个简单的触发器,更新THEOTHERTABLE时触发。我已经尝试在每行之前输出到dbms_output,并且在语句之后,它在编译触发器TRIGGER之后第一次触发 – Joao 2010-01-07 16:28:50

回答

4

我试图重新创建你的场景,它似乎对我来说工作得很好。所以我认为你应该再看看你的实现。寻找你所编码的内容与这里的内容之间的区别,也许这就是答案的出处。

这里是我的触发器

SQL> create or replace 
    2 trigger t1_compound 
    3 for insert or update on t1 
    4 compound trigger 
    5 
    6  after statement is 
    7  begin 
    8   update t2 set t1_id = nvl(t1_id,0) + 1 where cod = 12; 
    9  end after statement; 
10 end; 
11/

Trigger created. 

SQL> 
SQL> create or replace 
    2 trigger t2_compound 
    3 for insert or update on t2 
    4 compound trigger 
    5 
    6  after statement is 
    7  begin 
    8   update t3 set t2_id = nvl(t2_id,0) + 1 where cod = 12; 
    9  end after statement; 
10 end; 
11/

Trigger created. 

SQL> 

...这里是测试数据...

SQL> select id, cod from t1 
    2/

     ID  COD 
---------- ---------- 
     1   12 

SQL> select id, cod, t1_id from t2 
    2/

     ID  COD  T1_ID 
---------- ---------- ---------- 
     11   12 

SQL> select id, cod, t2_id from t3 
    2/

     ID  COD  T2_ID 
---------- ---------- ---------- 
     111   12 

SQL> 

...这是什么情况,当我发出第一个表的更新...

SQL> update t1 set dt = sysdate 
    2 where id = 1 
    3/

1 row updated. 

SQL> select id, cod, t1_id from t2 
    2/

     ID  COD  T1_ID 
---------- ---------- ---------- 
     11   12   1 

SQL> select id, cod, t2_id from t3 
    2/

     ID  COD  T2_ID 
---------- ---------- ---------- 
     111   12   1 

SQL> 
-2

我不认为它应该工作...这将是更好,如果你会为THEOTHERTABLE创建一个过程和调用程序从这个触发器。

0

如果在编译后触发做到这一点,但如果你再试试它的工作原理,甚至与其它数据,也不会更新THEOTHERTABLE