PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

OUÇA/NOTIFY usando pg_notify(texto, texto) no PostgreSQL


Eu discuti isso na lista de discussão do PostgreSQL (http://archives.postgresql.org/pgsql-bugs/2011-03/msg00041.php) e fui informado sobre o motivo do comportamento.

A resposta deles é que "..você tem que colocar aspas duplas nos relnames (ouvir "Test"). se você quiser que o servidor não os dobre. pg_notify pega uma string, não arelname, que usa regras diferentes." (Obrigado Merlin e Tom)

Isso significa que o seguinte funciona porque o canal é sempre forçado a usar letras minúsculas
LISTEN ERRORCHANNEL;

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

Se você adicionar aspas duplas ao redor do nome do canal, o caso será mantido.

Assim, com o seguinte, você receberia a primeira notificação, mas não a segunda:
LISTEN "ERRORCHANNEL";

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

Da mesma forma, o seguinte funcionará porque as aspas duplas forçam o caso de ERRORCHANNEL a ser mantido:
LISTEN "ERRORCHANNEL";

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

Enquanto isso não funcionará:
LISTEN ERRORCHANNEL;

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

Nesta situação, ERRORCHANNEL não está entre aspas duplas no comando LISTEN, então o PostgreSQL o força para letras minúsculas. O parâmetro channel é do tipo text em vez de relname, então o caso é deixado intocado na função pg_notify(). Juntos, os canais não coincidem (ERRORCHANNE !=errorchannel) então a notificação nunca é recebida.