|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||||
|
Invité régulier
![]() Inscription : avril 2006 Messages : 70 ![]() |
Bonjour à tous
En ce moment, je travaille sur projet en base de donnée distribuée, sql*plus. Je crée des trigger qui réplique des tables, bref. J'ai un sérieux soucis, lorsque j'ai une insertion sur une table A, le trigger A se déclanche, mais à l'intérieur, il y a une instruction qui déclanche le trigger B. Et le Trigger B lit la table qui lance trigger A. Donc il y a problème de nuting avec l'exécution du Trigger A, lors de l'insertion de la Tabla A. Donc la solution c'est de désactiver le Trigger B quand il trigger A s'exécute, mais comment le faire d'une manière dynamique. ça fonctionne si avant mon insertion je désactive le trigger B puis après insertion de la table A je le réactive, mais ça va pas du tout cette solution il faut que ça soit automatique. Donc j'ai essayé une autre solution avec execute immediate en créant une procédure qui active et désactive le trigger, mais quand je lance cette procédure dans le trigger il me dit le message suivant : Code :
Je peux vous faire voir mon code mais c'est un peu compliqué à expliquer voici mon trigger A : Code :
Ma fonction qui désactive le trigger B Code :
Code :
c'est le update à l'intérieur sur la table Departamento. A ce moment il y a le Trigger replicDepartamento qui se déclancche quand on fait une mise à jour sur la table Departamento en apellant le procédure despuesActualizDepartamento, qui à l'intérieur fait un select sur la table Empleado est donc ça c'est interdit,, car c'est la table qui déclanche le trigger actulizarEmpleadoOragen. La context est un peu difficile à expliquer. je peux juste vous donner une vue partiel des relation qu'il y a dans mon système Les cardinalités sont les suivantes: un empleado peu administré un et un suel départemento (0,1) un empleado travaille dans un suel départamento (1,1) Un départamento est administré par un et un seul administrateur (1,1), qui est un empleado avec le superdni à 1. Désolé pour le code et les noms de variable, je fait actuellement un projet espagnol, je m'exuse aussi pour la grandeur de mon message. Mom problème est assez urgent, mon système tourne parfaitement, à par ce problème, et ce projet téoriquement je devais à la fin du week-end, je pense quelqu'un devra avoir la solution, il y a toujours des solutions que ne pense pas, en tout cas je vous en serais très reconnaissant, merci par avance dav79 |
||||||||
|
|
00
|
|
|
#2 | ||
|
Invité régulier
![]() Inscription : avril 2006 Messages : 70 ![]() |
Bonsoir à tous,
Je r'explique mon problème plus brievement, Je voudrais désactiver mon trigger B quand mon trigger A s'exécute à un endroit nécessaire pour l'empécher qu'il appel le trigger B est que c'est possible oui ou non. Exemple de trigger A pour schématisé Code :
ça correspond à ma procédure controlarReplicDepartamento Si c'est possible comment il faut si prendre, Merci d'avance pour vos solutions dav79 |
||
|
|
00
|
|
|
#3 | ||
|
Membre habitué
![]() Inscription : février 2006 Messages : 139 ![]() |
Bonsoir,
pour avoir vecu ce probleme de ping pong, c'est clair que c'est une torture. Perso je te conseillerais plutot de creer une variable globale(qui sera probablement une table suivant ton architecture) permettant d'indiquer si le corps du trigger doit etre executé ou pas: Code :
Cdt |
||
|
|
00
|
|
|
#4 |
|
Invité régulier
![]() Inscription : avril 2006 Messages : 70 ![]() |
Merci beaucoup Kervoaz, pour ta réponse,
Mais comment on s'y prend pour créer cette variable globale. Peut t'on désactiver un trigger dans un même trigger. Mais comment on fait car pour désactiver un trigger il faut faire un alter trigger est c'est une commande LDD qui n'est pas autorisé dans un trigger d'après ce que j'ai compris. Tu peux me donner un peu plus de détaille sur ta méthode, j'aimerai bien la mettre en oeuvre mais je n'ai pas bien compris. En fait j'ai juste compris qu'il faut créer un variable globale booléenne, qu'on va tester à l'intérieur du trigger. Est ce qu'on peut créer une variable booléenne sur un trigger pour l'activer ou le désactiver Merci pour tes réponses. dav79 |
|
|
00
|
|
|
#5 |
|
Invité régulier
![]() Inscription : avril 2006 Messages : 70 ![]() |
Ok, par rapport à ton explication, ça revient un peu près au même je désactive le trigger 2, là ou c'est nécessaire puis je le réactive ensuite.
Le problème c'est dans mon fonction j'utilise un commande execute immediate et cette commande fait automatiquement un commit. Et le trigger n'accepte pas les commit ou les rallback, donc je ne voix pas comment tu fait pour contourner ce problème, que tu t'iutilise un booléan pour activier ou désactiver un trigger, ce n'est pas le problème. Le problème c'est de le faire dans à l'intérieur d'un trigger. Peu tu me répondre rapidement, car effet je doit rendre mon projet demain ça m'arrangerait bien pour débloquer mon problème. Où si d'autres on la solution Merci d'avance dav79 |
|
|
00
|
|
|
#6 | ||
|
Membre habitué
![]() Inscription : février 2006 Messages : 139 ![]() |
Bonsoir,
en fait ce n'est pas desactiver les triggers mais c'est mettre un test pour ne pas executer tout le code du trigger. Le plus simple: une table avec 2 colonnes t_lock(triggerA number(1), triggerB number(1)) Code :
j'espere avoir compris ton probleme car j'ai un doute maintenant... Cdt |
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com