Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/12/2007, 16h36   #1
Invité de passage
 
Inscription : janvier 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 5
Points : 2
Points : 2
Par défaut 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
festayre47 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2007, 18h29   #2
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
comment vous vous rendez compte que le trigger s'exécute deux fois?
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2007, 19h25   #3
Invité de passage
 
Inscription : janvier 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 5
Points : 2
Points : 2
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).
festayre47 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2007, 19h34   #4
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
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"?
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2007, 19h39   #5
Invité de passage
 
Inscription : janvier 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 5
Points : 2
Points : 2
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
festayre47 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2007, 19h57   #6
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
Il n'y a pas de contraintes référentielle de la table sur elle-même?
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2007, 10h39   #7
Invité de passage
 
Inscription : janvier 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 5
Points : 2
Points : 2
Je n'ai pas de contrainte réferentielle sur la table elle même. J'ai des contraintes vers d'autres tables.
festayre47 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2007, 11h59   #8
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
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
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2007, 12h02   #9
Invité de passage
 
Inscription : janvier 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 5
Points : 2
Points : 2
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.
festayre47 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h47.


 
 
 
 
Partenaires

Hébergement Web