PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

ASCOLTA/NOTA usando pg_notify(testo, testo) in PostgreSQL

Ne ho discusso sulla mailing list di PostgreSQL (http://archives.postgresql.org/pgsql-bugs/2011-03/msg00041.php) e sono stato informato sul ragionamento del comportamento.

La loro risposta è che "..devi citare due volte i relnames (ascolta "Test"). se vuoi che il server non li pieghi tra maiuscole e minuscole. pg_notify prende una stringa, non arelname, che usa regole diverse." (Grazie Merlino e Tom)

Ciò significa che quanto segue funziona perché il canale è sempre forzato in minuscolo

LISTEN ERRORCHANNEL;

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

Se dovessi aggiungere virgolette intorno al nome del canale, il caso verrebbe mantenuto.

Quindi, con quanto segue, riceverai la prima notifica ma non la seconda:

LISTEN "ERRORCHANNEL";

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

Allo stesso modo, quanto segue funzionerà perché le doppie virgolette obbligano a mantenere il caso di ERRORCHANNEL:

LISTEN "ERRORCHANNEL";

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

Anche se questo non funzionerà:

LISTEN ERRORCHANNEL;

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

In questa situazione ERRORCHANNEL non è tra virgolette nel comando LISTEN, quindi PostgreSQL lo costringe a lettere minuscole. Il parametro del canale è di tipo text anziché relname, quindi il caso non viene toccato nella funzione pg_notify(). Insieme i canali non corrispondono (ERRORCHANNE !=errorchannel) quindi la notifica non viene mai ricevuta.