PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

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

Ich habe dies auf der PostgreSQL-Mailingliste (http://archives.postgresql.org/pgsql-bugs/2011-03/msg00041.php) diskutiert und wurde über die Gründe für das Verhalten informiert.

Ihre Antwort ist, dass "..Sie relnames in doppelte Anführungszeichen setzen müssen (hören Sie "Test"). wenn Sie möchten, dass der Server sie nicht in Groß- und Kleinschreibung umwandelt. pg_notify nimmt einen String, keinen arelname, der andere Regeln verwendet." (Danke Merlin und Tom)

Das bedeutet, dass Folgendes funktioniert, da der Kanal immer auf Kleinschreibung gezwungen wird

LISTEN ERRORCHANNEL;

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

Wenn Sie den Kanalnamen in doppelte Anführungszeichen setzen, wird die Groß-/Kleinschreibung beibehalten.

Mit dem Folgenden erhalten Sie also die erste Benachrichtigung, aber nicht die zweite:

LISTEN "ERRORCHANNEL";

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

In ähnlicher Weise funktioniert Folgendes, da die doppelten Anführungszeichen die Beibehaltung der Schreibweise von ERRORCHANNEL erzwingen:

LISTEN "ERRORCHANNEL";

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

Dies wird zwar nicht funktionieren:

LISTEN ERRORCHANNEL;

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

In dieser Situation steht ERRORCHANNEL im LISTEN-Befehl nicht in doppelten Anführungszeichen, sodass PostgreSQL die Kleinschreibung erzwingt. Der Kanalparameter ist eher vom Typ text als relname, sodass die Groß-/Kleinschreibung in der Funktion pg_notify() unberührt bleibt. Zusammen stimmen die Kanäle nicht überein (ERRORCHANNE !=Fehlerkanal), sodass die Benachrichtigung nie empfangen wird.