|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : décembre 2006 Messages : 2 ![]() |
Bonjour,
je suis en train de développer une application en C avec une base de données postgreSQL et je débute seulement avec postgreSQL même si j'avais déja manipulé d'autres base de données auparavant. Je vous explique mon problème. J'ai créé un trigger after qui lance une fonction créée en C. Cette fonction lance un appel de procédure sur un serveur distant afin qu'il récupère la ligne que l'on vient d'insérer. Le problème est que à priori tant que le trigger ne s'est pas fini l'insertion n'est pas considéré comme valide. Je ne peux pas récupérer l'élément inséré tant que le trigger n'est pas fini or, c'est dans le trigger que j'appelle la fonction qui récupère la ligne insérée via un SELECT . Je me suis rendu compte de cela en faisant quelques petits tests genre mettre un sleep(20) dans le trigger et voir que mon insertion dure alors plus de 20 secondes. Pour éviter ce problème j'ai donc appelé ma procédure distante via un fork() pour créer un nouveau processus mais le problème est que je ne peux pas savoir si l'insertion s'est fini ou pas c'est-à-dire que si ma base de données se mettait a ramer lors de l'insert mon trigger ne le saurait pas et je ne pourrais pas récupérer la ligne insérée. Je ne sais pas si j'ai été clair en tout cas voila mes soucis si quelqu'un peut m'aider pour me dire par exemple comment savoir lorsqu'un INSERT est fini. Merci par avance, GuiGeek |
|
|
00
|
|
|
#2 |
|
Membre émérite
![]() Développeur informatique Inscription : juin 2004 Messages : 699 ![]() |
Je ne sais pas s'il est possible de faire ce que tu demandes, mais ça m'a l'air un peu tarabiscoté comme méthode : au lieu de dire au serveur distant de venir récupérer les données, il ne serait pas plus rationnel que ta fonction lui passe elle-même les données en paramètre ?
__________________
Roland |
|
|
00
|
|
|
#3 |
|
Expert Confirmé
![]() ![]() |
Je ne suis pas bien sûr d'avoir compris tous les tenants et aboutissants de ton souci, mais je suis à peu près sûr que ça n'est pas un trigger qu'il te faut : les trigger sont fait pour manipuler les données, et tu tentes d'en détourner l'usage.
Pilote ton insertion dans une fonction, qui retournera un booléen (à true si l'insertion est OK, ...), et ensuite tu pourras lancer ta procédure de récupération/envoi d'informations.
__________________
"Ce que l'on conçoit bien s'énonce clairement, Et les mots pour le dire arrivent aisément." Nicolas Boileau "Expliquer empêche de comprendre si cela dispense de chercher" Quiz Oracle : venez tester vos connaissances ! |
|
|
00
|
|
|
#4 |
|
Expert Confirmé
![]() Inscription : septembre 2006 Messages : 2 291 ![]() |
typiquement le mécanisme LISTEN/NOTIFY peut être utilisé pour ce genre de chose…
possible solution : créer une table 'events' avec une colonne du même type que la PRIMARY KEY de la table originale concernée dans laquelle vous insérerez la key du record inséré lors du trigger faites un NOTIFY sur cette table de l'autre côté, faites un LISTEN sur la table 'events'… SELECT les records, faites le traitement, effacez les records traités (ou marquez les records comme ayant été traités pour ne pas les traiter plus d'une fois)… (avec une colonne event_type en plus vous pourrez "écouter" tout ce que vous voudrez de l'autre côté… en insérant des records ad-hoc dans events avec l'event_type correspondant…) |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com