sql >> Databasteknik >  >> RDS >> PostgreSQL

LISTEN/NOTIFY med pg_notify(text, text) i PostgreSQL

Jag har diskuterat detta på PostgreSQL-sändlistan (http://archives.postgresql.org/pgsql-bugs/2011-03/msg00041.php) och blev informerad om orsaken till beteendet.

Deras svar är att "..du måste dubbelcitera relnames (lyssna "Test"). om du vill att servern inte ska skifta dem. pg_notify tar en sträng, inte arelname, som använder olika regler." (Tack Merlin och Tom)

Det betyder att följande fungerar eftersom kanalen alltid tvingas till små bokstäver

LISTEN ERRORCHANNEL;

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

Om du skulle lägga till dubbla citattecken runt kanalnamnet, kommer fallet att behållas.

Så med följande får du det första meddelandet men inte det andra:

LISTEN "ERRORCHANNEL";

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

På samma sätt kommer följande att fungera eftersom de dubbla citattecken tvingar fallet med ERRORCHANNEL att bibehållas:

LISTEN "ERRORCHANNEL";

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

Även om detta inte kommer att fungera:

LISTEN ERRORCHANNEL;

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

I den här situationen står ERRORCHANNEL inte inom citattecken i kommandot LISTEN så PostgreSQL tvingar det till gemener. Kanalparametern är av typen text istället för relname så fallet lämnas orörd i funktionen pg_notify(). Tillsammans stämmer inte kanalerna överens (ERRORCHANNE !=errorchannel) så meddelandet tas aldrig emot.




  1. Hur Pi() fungerar i PostgreSQL

  2. Öppna modal dialogruta via JavaScript Oracle APEX

  3. Hur använder man variabelinställningar i triggerfunktioner?

  4. MySQL - Kan du hämta standardvärdet för en kolumn?