|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||||||
|
Expert Confirmé
![]() ![]() |
Bonjour,
J'ai un problème de verrous que je ne parviens pas a résoudre (certainement par manque d'expérience avec Oracle). Tout d'abord j'ai une table PARTICIPATION : Code :
Par ailleurs j'ai une table PODIUM : Code :
J'ai une procédure stockée qui permet de vérifier si tout les temps sont enregistré pour une course (et donc savoir si il est possible de faire le podium). Cette procédure est : Code :
Code :
Maintenant abordons le problème. Je souhaiterais que la génération des podium soit automatique a la saisie du temps. Donc qu'un trigger a l'insert et a l'update d'un temps génère le podium. voici le trigger : Code :
Oracle me refuse donc son exécution puisque apparemment la table PARTICIPATION est vérouillée. Comment ferez vous pour contourner ce problème ? Ça fait un moment que je cherche une solution propre mais je ne trouve rien. Merci par avance.
__________________
http://alaindefrance.wordpress.com - http://www.alain-defrance.com Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1 Project Lead eXo Social Java Black Belt - Java Black Belt Coach |
||||||||||
|
00
|
|
|
#2 |
|
Futur Membre du Club
![]() Inscription : mars 2008 Messages : 18 ![]() |
En premier lieu, je vérifierai la présence d'un commit après la suppression des lignes au sein de la table PODIUM, delete réalisé par la procedure CLEAR_PODIUM_COURSE appelée par GEN_PODIUM_COURSE.
Mais sans le code de cette procedure CLEAR_PODIUM_COURSE, cest toi qui devra le faire |
|
|
00
|
|
|
#3 | |||
|
Expert Confirmé
![]() ![]() |
Citation:
Donc que je commit en début ou en fin ça changera je pense rien. je n'ai pas détaillé la procédure CLEAR_PODIUM_COURSE parce qu'elle n'apporte rien dans la résolution du problème. Enfin je peu me tromper, surtout que je me retrouve bloqué ![]() Je tacherais de poster la procédure en question dans la journée (la je l'ai pas sous la main). Edit : Voila la procédure CLEAR_PODIUM_COURSE Code :
__________________
http://alaindefrance.wordpress.com - http://www.alain-defrance.com Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1 Project Lead eXo Social Java Black Belt - Java Black Belt Coach |
|||
|
00
|
|
|
#4 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 320 ![]() |
Tu n'a pas un problème de verrous (en Oracle le select ne bloque pas), tu a le problème de la table en mutation il me semble, n’est pas vrai ?
|
|
|
00
|
|
|
#5 |
|
Membre habitué
![]() Inscription : février 2006 Messages : 139 ![]() |
Bonjour,
Effectivement tu tentes de lire des données en cours de modification. Pourquoi la procedure CHECK_VALID_COURSE est appellé for each row? Il ne suffirait pas de verifier si :NEW.SPORTIF_ID is not null :NEW.TEMPS is not null dans le trigger? Pour pallier en fait à la possibilté de mettre null dans TEMPS. Cdt |
|
|
00
|
|
|
#6 | |
|
Expert Confirmé
![]() ![]() |
Bonjour,
Parce que pour vérifier que la course soit valide je dois vérifier que toutes les inscriptions sont un temps saisie. Citation:
Cela consisterais a faire une fonction d'insertion et cette dernier exécuterais la vérification ainsi que la génération juste après l'insertion. Cela présente un désavantage : Si l'utilisateur de la base de donnée n'utilise pas la fonction, la base de donnée devient sémantiquement incohérente. C'est déjà le cas, mais je souhaite justement que le fait de remplir tout les champs temps d'une course donnée déclenche tout un ensemble de procédure procédant au remplissage du podium. Merci beaucoup de t'être penché sur mon problème.
__________________
http://alaindefrance.wordpress.com - http://www.alain-defrance.com Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1 Project Lead eXo Social Java Black Belt - Java Black Belt Coach |
|
|
00
|
|
|
#7 | |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 320 ![]() |
Citation:
|
|
|
|
00
|
|
|
#8 |
|
Expert Confirmé
![]() ![]() |
Non, mais la base de donnée est sensé être saisie au travers de fonction, et aucune fonction est prévu a cet effet.
Le système de procédure / fonction stocké garanti une intégrité respecté.
__________________
http://alaindefrance.wordpress.com - http://www.alain-defrance.com Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1 Project Lead eXo Social Java Black Belt - Java Black Belt Coach |
|
00
|
|
|
#9 |
|
Membre confirmé
![]() Inscription : août 2005 Messages : 270 ![]() |
La première idée qui me vient est l'utilisation de dbms_scheduler.
A chaque insert, tu lances un batch (dbms_scheduler) pour un pouilleme de temps plus tard. Je n'ai jamais testé le lancement de batch dans un trigger. Pour faire "sérieux" et gérer des interactions massive avec la base, à chaque insert tu tests s'il y a un batch en attente, si non, tu en mets un. |
|
|
00
|
|
|
#10 |
|
Membre habitué
![]() Inscription : février 2006 Messages : 139 ![]() |
La fonction d'insertion est une bonne chose du point de vue architecture.
La modification du modèle se fait via des fonctions de la couches supérieures. De plus les triggers peuvent vite avoir des effets pervers lors de traitement de masse. |
|
|
00
|
|
|
#11 | |
|
Expert Confirmé
![]() ![]() |
Citation:
Je vous tiens au courant En tout cas merci beaucoup pour vos avis.
__________________
http://alaindefrance.wordpress.com - http://www.alain-defrance.com Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1 Project Lead eXo Social Java Black Belt - Java Black Belt Coach |
|
|
00
|
|
|
#12 |
|
Expert Confirmé
![]() ![]() |
La solution de l'appel dans la procédure a porté ses fruits.
Merci a tous d'avoir contribué a solutionner le problème.
__________________
http://alaindefrance.wordpress.com - http://www.alain-defrance.com Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1 Project Lead eXo Social Java Black Belt - Java Black Belt Coach |
|
00
|
Copyright © 2000-2012 - www.developpez.com