PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

LISTEN/NOTIFY za pomocą pg_notify(text, text) w PostgreSQL

Omówiłem to na liście dyskusyjnej PostgreSQL (http://archives.postgresql.org/pgsql-bugs/2011-03/msg00041.php) i zostałem poinformowany o przyczynach takiego zachowania.

Ich odpowiedź brzmi:"..musisz podwójnie cytować nazwy relname (posłuchaj "Test"), jeśli chcesz, aby serwer nie łamał ich wielkością liter. pg_notify pobiera ciąg znaków, a nie arelname, który używa innych reguł." (Dzięki Merlin i Tom)

Oznacza to, że poniższe działania działają, ponieważ kanał zawsze musi pisać małymi literami

LISTEN ERRORCHANNEL;

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

Jeśli dodasz podwójne cudzysłowy wokół nazwy kanału, wielkość liter zostanie zachowana.

W związku z powyższym otrzymasz pierwsze powiadomienie, ale nie drugie:

LISTEN "ERRORCHANNEL";

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

Podobnie zadziała poniższe, ponieważ podwójne cudzysłowy wymuszają zachowanie przypadku ERRORCHANNEL:

LISTEN "ERRORCHANNEL";

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

Chociaż to nie zadziała:

LISTEN ERRORCHANNEL;

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

W tej sytuacji ERRORCHANNEL nie jest ujęty w cudzysłów w poleceniu LISTEN, więc PostgreSQL wymusza zapisanie go małymi literami. Parametr channel jest typu text, a nie relname, więc wielkość liter pozostaje niezmieniona w funkcji pg_notify(). Kanały razem nie pasują do siebie (ERRORCHANNE !=errorchannel), więc powiadomienie nigdy nie jest odbierane.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Użyj zapytania where w typie danych JSONB w Rails Postgres

  2. kopia zapasowa bazy danych odoo12 brak właściciela?

  3. Rails i Postgresql:jak grupować zapytania według godziny?

  4. Pobierz rekordy, które są niezerowe po przecinku w PostgreSQL

  5. Utwórz unikalne ograniczenie z pustymi kolumnami