PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

LISTEN/NOTIFY en utilisant pg_notify(text, text) dans PostgreSQL

J'en ai discuté sur la liste de diffusion PostgreSQL (http://archives.postgresql.org/pgsql-bugs/2011-03/msg00041.php) et j'ai été informé du raisonnement du comportement.

Leur réponse est que "..vous devez doubler les relnames (écoutez "Test"). si vous voulez que le serveur ne les casse pas. pg_notify prend une chaîne, pas un relname, qui utilise des règles différentes." (Merci Merlin et Tom)

Cela signifie que ce qui suit fonctionne car le canal est toujours forcé en minuscules

LISTEN ERRORCHANNEL;

NOTIFY ERRORCHANNEL, 'something!';
NOTIFY eRrorChanNel, 'something!';

Si vous deviez ajouter des guillemets doubles autour du nom de la chaîne, la casse serait conservée.

Ainsi, avec ce qui suit, vous recevrez la première notification mais pas la seconde :

LISTEN "ERRORCHANNEL";

NOTIFY "ERRORCHANNEL", 'something!'; 
NOTIFY "eRrorChanNel", 'something!';

De même, ce qui suit fonctionnera car les guillemets doubles forcent le maintien de la casse de ERRORCHANNEL :

LISTEN "ERRORCHANNEL";

SELECT pg_notify('ERRORCHANNEL', 'something!');

Même si cela ne fonctionnera pas :

LISTEN ERRORCHANNEL;

SELECT pg_notify('ERRORCHANNEL', 'something!');

Dans cette situation, ERRORCHANNEL n'est pas entre guillemets doubles dans la commande LISTEN donc PostgreSQL le force en minuscules. Le paramètre channel est de type text plutôt que relname donc la casse est laissée intacte dans la fonction pg_notify(). Ensemble, les canaux ne correspondent pas (ERRORCHANNE !=errorchannel) donc la notification n'est jamais reçue.