2010-01-05 9 views
1

j'ai un déclencheur composé et dans la AFTER je une mise à jour autre table qui a également un déclencheur de composé, comme dans le code ci-dessous:composé déclencheurs dans l'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; 

La mise à jour est un simple un pour voir si ça marche. Je veux qu'il déclenche le trigger sur THEOTHERTABLE, mais il ne se déclenche que si le trigger n'est pas composé.

Est-ce un problème avec les déclencheurs composés Oracle ou juste une fonctionnalité que je ne comprends pas?

+0

Qu'est-ce que la gâchette THEOTHERTABLE ressembler? –

+0

c'est un déclencheur simple qui se déclenche à la mise à jour de THEOTHERTABLE. J'ai essayé de sortie à dbms_output avant chaque ligne, et après l'instruction et il se déclenche juste la première fois après la compilation du déclencheur TRIGGER – Joao

Répondre

4

J'ai tenté de recréer votre scénario et cela semble fonctionner correctement pour moi. Donc je pense que vous devriez revoir votre implémentation. Cherchez les différences entre ce que vous avez codé et ce qui suit ici, et c'est peut-être là que réside la réponse.

Voici mes déclencheurs

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> 

... voici les données de test ...

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> 

... et c'est ce qui arrive quand je lance une mise à jour sur la première table ...

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

je ne pense pas que cela devrait fonctionner ... ce serait mieux si vous créez une procédure pour THEOTHERTABLE et appeler procédure à partir de ce déclencheur.

0

Il fonctionne si vous le faites après avoir compilé le déclencheur mais si vous l'essayez à nouveau, même avec d'autres données, il ne sera pas mise à jour THEOTHERTABLE