sql >> Base de Datos >  >> RDS >> PostgreSQL

ESCUCHAR/NOTIFICAR usando pg_notify(texto, texto) en PostgreSQL

He discutido esto en la lista de correo de PostgreSQL (http://archives.postgresql.org/pgsql-bugs/2011-03/msg00041.php) y me informaron sobre el razonamiento del comportamiento.

Su respuesta es que "..tienes que poner comillas dobles en los nombres de dominio (escucha "Prueba"). Si quieres que el servidor no los doble, pg_notify toma una cadena, no un nombre de dominio, que usa reglas diferentes". (Gracias Merlín y Tom)

Esto significa que lo siguiente funciona porque el canal siempre se fuerza a minúsculas

LISTEN ERRORCHANNEL;

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

Si agregara comillas dobles alrededor del nombre del canal, se mantendría el caso.

Entonces, con lo siguiente, recibirías la primera notificación pero no la segunda:

LISTEN "ERRORCHANNEL";

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

De manera similar, lo siguiente funcionará porque las comillas dobles obligan a mantener el caso de ERRORCHANNEL:

LISTEN "ERRORCHANNEL";

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

Si bien esto no funcionará:

LISTEN ERRORCHANNEL;

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

En esta situación, ERRORCHANNEL no está entre comillas dobles en el comando LISTEN, por lo que PostgreSQL lo obliga a usar minúsculas. El parámetro del canal es de tipo texto en lugar de relname, por lo que el caso se deja intacto en la función pg_notify(). Juntos, los canales no coinciden (ERRORCHANNE !=errorchannel) por lo que nunca se recibe la notificación.