2010-04-24 7 views
2

Je souhaite créer un déclencheur qui s'exécute lors de la mise à jour d'une table.Base de données Oracle sur l'annulation de l'échec du déclencheur

en particulier lors de la mise à jour d'une table je souhaite mettre à jour une autre table via un trigger mais si le trigger échoue (REFERENTIAL INTEGRITY-- ENTITY INTEGRITY) je ne veux plus exécuter la mise à jour.

Une suggestion sur la façon d'effectuer cela?

Vaut-il mieux utiliser un déclencheur ou le faire de façon anagrammique via une procédure stockée?

Merci

Répondre

3

Le DML dans le déclencheur fait partie de la même action que le DML déclencheur. Les deux doivent réussir ou échouer. Si le déclencheur déclenche une exception non gérée, l'instruction entière est annulée.

Voici un déclencheur sur T23 qui copie la ligne dans T42.

SQL> create or replace trigger t23_trg 
    2  before insert or update on t23 for each row 
    3 begin 
    4  insert into t42 values (:new.id, :new.col1); 
    5 end; 
    6/

Trigger created. 

SQL> 

Une inserrt réussie dans T23 ...

SQL> insert into t23 values (1, 'ABC') 
    2/

1 row created. 

SQL> select * from t42 
    2/

     ID COL 
---------- --- 
     1 ABC 

SQL> 

Mais celui-ci échouera à cause d'une contrainte unique sur T42.ID. Comme vous pouvez le voir, l'instruction de déclenchement est également annulée ...

SQL> insert into t23 values (1, 'XYZ') 
    2/
insert into t23 values (1, 'XYZ') 
      * 
ERROR at line 1: 
ORA-00001: unique constraint (APC.T24_PK) violated 
ORA-06512: at "APC.T23_TRG", line 2 
ORA-04088: error during execution of trigger 'APC.T23_TRG' 


SQL> select * from t42 
    2/

     ID COL 
---------- --- 
     1 ABC 

SQL> select * from t23 
    2/

     ID COL 
---------- --- 
     1 ABC 

SQL> 
0

Si le déclencheur échoue, il déclenche une exception (à moins que vous le dire expressément pas), auquel cas, vous auriez le rollback client. Peu importe si c'est fait via un trigger ou un SP (bien que ce soit souvent une bonne idée de garder une transaction logique dans un SP, plutôt que de l'étaler sur les déclencheurs).

Questions connexes