Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
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 19/12/2006, 12h01   #1
Invité de passage
 
Inscription : décembre 2006
Messages : 2
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 2
Points : 0
Points : 0
Par défaut Trigger after insertion pas validée

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
guigeek est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2006, 15h05   #2
rsc
Membre émérite
 
Avatar de rsc
 
Homme
Développeur informatique
Inscription : juin 2004
Messages : 699
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 61
Localisation : France, Côte d'Or (Bourgogne)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2004
Messages : 699
Points : 874
Points : 874
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
rsc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2006, 09h22   #3
Xo
Expert Confirmé
 
Avatar de Xo
 
Inscription : janvier 2005
Messages : 2 701
Détails du profil
Informations personnelles :
Âge : 38

Informations forums :
Inscription : janvier 2005
Messages : 2 701
Points : 3 237
Points : 3 237
Envoyer un message via Skype™ à Xo
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 !

La FAQ Oracle : 138 réponses à vos questions
Aidez-nous à la compléter
Xo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2006, 13h37   #4
Expert Confirmé
 
Homme
Inscription : septembre 2006
Messages : 2 291
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : septembre 2006
Messages : 2 291
Points : 2 738
Points : 2 738
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…)
JeitEmgie est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h46.


 
 
 
 
Partenaires

Hébergement Web