-
Trigger after delete
Bonjour,
Voila mon problème :
J'ai 2 triggers sur une même table
-Un after insert,update,delete for each row
-Un after insert,updat,delete
Lorsque j'effectue un delete sur la table concernée, le trigger qui s'effectue sur toute la table (le 2eme) est exécuté 2 fois :
- Une fois en passant dans la partie If updating ... end if;
- Une autre fois en passant dans la partie If deleting... end if;
Comment se fait-il qu'il soit exécuté comme si un update avait été fait?
Je précise qu'aucun update sur la table n'est effectué dans le code de ce trigger.
Merci d'avance
-
comment vous vous rendez compte que le trigger s'exécute deux fois?
-
J'ai mis des instructions dms_output.put_line et j'ai fait un delete sur ma table. En regardant le output, je vois qu'il s'execute 2 fois (2 fois les traces).
-
DBMS_OUTPUT a bien été mis dans la partie if updating ...end if?
Avez vous essayé de produire deux sorties différentes dans les deux parties de code "if updating" et "if deleting"?
-
Oui c'est ce que j'ai fait.
J'ai mis un dbms_output affichant "debut" au tout debut du trigger.
J'ai mis "udpate" dans le if updating ... end if
J'ai mis "delete" dans le if deleting... end if
Mon resultat :
debut
update
debut
delete
Précisions : Je suis avec une version 8.1.7 d'oracle
-
Il n'y a pas de contraintes référentielle de la table sur elle-même?
-
Je n'ai pas de contrainte réferentielle sur la table elle même. J'ai des contraintes vers d'autres tables.
-
Il reste un seul cas en dehors des triggers:
Une contrainte référentielle sur la table t1 qui référence une autre soit t2. Maintenant si un "delte" de la table t1 provoque un "delete" de la table t2 qui à son tour et à cause de la contrainte référentielle sur t1 provoquerait un update si la contrainte est définie on delete set null
-
J'ai trouvé.
En fait il y a une contrainte réferentielle sur une autre table t2 avec un delete cascade. Le delete sur ma premiere table t1 declenche un delete des enregistrements fils sur t2. Il y a un trigger on delete sur t2. Ce trigger effectue un update sur t1 => d'où le déclenchement du trigger after update sur t1.
Merci pour votre aide.