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

LISTEN/NOTIFY ved hjælp af pg_notify(text, text) i PostgreSQL

Jeg har diskuteret dette på PostgreSQL-mailinglisten (http://archives.postgresql.org/pgsql-bugs/2011-03/msg00041.php) og blev informeret om begrundelsen for adfærden.

Deres svar er, at "..du er nødt til at citere relnames (lyt "Test"). Hvis du vil have serveren ikke til store bogstaver, skal du folde dem. pg_notify tager en streng, ikke arelname, som bruger forskellige regler." (Tak Merlin og Tom)

Det betyder, at følgende virker, fordi kanalen altid er tvunget til at skrive små bogstaver

LISTEN ERRORCHANNEL;

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

Hvis du skulle tilføje dobbelte anførselstegn omkring kanalnavnet, ville sagen blive bibeholdt.

Så med følgende vil du modtage den første meddelelse, men ikke den anden:

LISTEN "ERRORCHANNEL";

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

På samme måde vil følgende virke, fordi de dobbelte anførselstegn tvinger tilfældet af ERRORCHANNEL til at blive vedligeholdt:

LISTEN "ERRORCHANNEL";

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

Selvom dette ikke virker:

LISTEN ERRORCHANNEL;

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

I denne situation er ERRORCHANNEL ikke i dobbelte anførselstegn i LISTEN-kommandoen, så PostgreSQL tvinger den til små bogstaver. Kanalparameteren er af typen tekst i stedet for relname, så sagen forbliver uberørt i pg_notify()-funktionen. Tilsammen matcher kanalerne ikke (ERRORCHANNE !=fejlkanal), så meddelelsen modtages aldrig.




  1. MySQL:Langsom log; tilføje CPU-brug

  2. Oracle:Er der en måde at få de seneste SQL-syntaksfejl på?

  3. Upsert i Postgres ved hjælp af node.js

  4. Simpel PHP SQL login fejlfinding