LISTEN / NOTIFY using pg_notify (texte, texte) dans PostgreSQL
J'ai été jouer avec PostgreSQL du système de notification et ne peut pas pour la vie de mon comprendre pourquoi pg_notify(texte, texte) ne fonctionne jamais. Cette fonctionnalité n'est pas trop documenté et je ne peux pas trouver de nombreux exemples de son utilisation dans la nature, alors j'ai pensé que personne n'aurait l'esprit me pose la question ici.
Exécutant la commande suivante fonctionne exactement comme prévu:
LISTEN my_channel;
NOTIFY my_channel, 'my message text';
À l'aide de la pg_notify() la fonction cependant renvoie une valeur nulle et aucune notification n'est envoyée. Aucune erreur n'est donné. Un exemple d'utilisation est:
SELECT pg_notify('my_channel', 'my message text');
Je pouvais utiliser le NOTIFIER fonction, cependant mon objectif est de simplifier la notification dans une requête comme ceci:
select pg_notify(get_player_error_channel(username)::TEXT, 'test'::TEXT)
from player;
Je suppose que je doit manquer quelque chose de ridicule, mais j'ai eu zéro chance de trouver la raison pour cela. La page de discuter de NOTIFIER peuvent être trouvés ici: http://www.postgresql.org/docs/9.0/static/sql-notify.html
Sur elle, il mentionne à ce propos pg_notify(), ce qui me fait supposer qu'il y aurait rien de radicalement différentes.
pg_notify
Pour envoyer une notification vous pouvez également utiliser la fonction pg_notify(texte, texte). La fonction prend le nom de canal comme premier argument et la charge utile que le second. La fonction est beaucoup plus facile à utiliser que de l'INFORMER de commande si vous avez besoin de travailler avec des non-constante des noms de canaux et de charges utiles.
Merci comme toujours pour l'assistance
Edit: la version de Base de données est:
"PostgreSQL 9.0.3 sur i686-pc-linux-gnu, compilé par GCC gcc (GCC) 4.2.4, 32-bit"
source d'informationauteur Abstrct
Vous devez vous connecter pour publier un commentaire.
J'ai discuté de cela sur le PostgreSQL liste de diffusion (http://archives.postgresql.org/pgsql-bugs/2011-03/msg00041.php) et a été informé sur le raisonnement pour le comportement.
Leur réponse est que "..vous avez des guillemets doubles relnames écoute ("Test"). si vous
le serveur de ne pas le cas pour les plier. pg_notify prend une chaîne de caractères, pas un
relname, qui utilise des règles différentes." (Merci Merlin et Tom)
Cela signifie que les ouvrages suivants, parce que le canal est toujours obligé de baisser cas
Si vous ajoutez des guillemets autour du nom de la chaîne, le cas serait maintenu.
Donc, avec le suivant, vous recevrez la première notification, mais pas le second:
De même, le travail car le double guillemets force le cas de ERRORCHANNEL être maintenu:
Alors que cela ne fonctionnera pas:
Dans cette situation ERRORCHANNEL n'est pas de guillemets dans la commande d'ÉCOUTE pour que PostgreSQL forces, il en minuscules. Le paramètre de canal est de type texte, plutôt que de relname de sorte que le cas est laissé intact dans le pg_notify() fonction. Ensemble, les canaux ne correspondent pas (ERRORCHANNE != errorchannel) si la notification n'est jamais reçu.
Si vous faites cela à partir de votre application, vous devez activement interroger la base de données pour les nouvelles notifications.
Il n'y a pas de "pousser" à partir du serveur vers le client.
Dans JDBC, vous devez exécuter une sorte d'instruction SELECT, puis tout en attendant la notification sera disponible sur l'objet de Connexion (voir http://jdbc.postgresql.org/documentation/head/listennotify.html)
Je ne sais pas comment cela fonctionne pour d'autres langages de programmation. Je pense que libpq (C/C++) a des fonctions spéciales pour récupérer directement les notifications sans exécution d'une instruction select