sql >> Database >  >> RDS >> PostgreSQL

LISTEN/NOTIFY met pg_notify(text, text) in PostgreSQL

Ik heb dit besproken op de PostgreSQL-mailinglijst (http://archives.postgresql.org/pgsql-bugs/2011-03/msg00041.php) en werd geïnformeerd over de redenering voor het gedrag.

Hun antwoord is dat "..je relnames moet dubbel citeren (luister "Test"). als je wilt dat de server ze niet vouwt. pg_notify neemt een string, geen arelname, die andere regels gebruikt." (Bedankt Merlijn en Tom)

Dit betekent dat het volgende werkt omdat het kanaal altijd kleine letters moet gebruiken

LISTEN ERRORCHANNEL;

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

Als je dubbele aanhalingstekens zou toevoegen rond de kanaalnaam, zou de case behouden blijven.

Dus met het volgende zou u de eerste melding ontvangen, maar niet de tweede:

LISTEN "ERRORCHANNEL";

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

Op dezelfde manier zal het volgende werken omdat de dubbele aanhalingstekens dwingen het geval van ERRORCHANNEL te handhaven:

LISTEN "ERRORCHANNEL";

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

Hoewel dit niet werkt:

LISTEN ERRORCHANNEL;

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

In deze situatie staat ERRORCHANNEL niet tussen dubbele aanhalingstekens in het LISTEN-commando, dus PostgreSQL dwingt het naar kleine letters. De kanaalparameter is van het type tekst in plaats van relname, dus het geval blijft onaangeroerd in de functie pg_notify(). Samen komen de kanalen niet overeen (ERRORCHANNE !=errorchannel) dus de melding wordt nooit ontvangen.




  1. SQL:een query onderbreken

  2. Trek SQL-gegevens uit twee tabellen

  3. MySQL converteren naar Doctrine Query Builder. Problemen met IF en CONCAT. Of een andere benadering voor subquery's op select

  4. Update Database Veld Foutcode Ontsteker