СЛУШАТЬ / УВЕДОМИТЬ, используя pg_notify (text, text) в PostgreSQL - PullRequest
15 голосов
/ 02 марта 2011

Я играл с системой уведомлений PostgreSQL и не могу понять, почему pg_notify (text, text) никогда не работает. Эта функция не слишком документирована, и я не могу найти много примеров ее использования в дикой природе, поэтому я подумал, что никто не будет против, если я задам этот вопрос.

Запуск следующих работает точно так, как ожидалось:

LISTEN my_channel;

NOTIFY my_channel, 'my message text';

Однако использование функции pg_notify () возвращает нулевое значение, и уведомление никогда не отправляется. Ошибок тоже не дано. Пример использования:

SELECT pg_notify('my_channel', 'my message text');

Я мог бы использовать функцию NOTIFY, но моя цель - упростить уведомление в запросе так:

select pg_notify(get_player_error_channel(username)::TEXT, 'test'::TEXT)
    from player;

Полагаю, мне не хватает чего-то нелепого, но мне не повезло, выясняя причину этого. Страницу, где обсуждается NOTIFY, можно найти здесь: http://www.postgresql.org/docs/9.0/static/sql-notify.html

В ней упоминается о pg_notify (), что заставляет меня предположить, что ничего радикально не будет.

pg_notify Для отправки уведомления вы также можете использовать функцию pg_notify (текст, текст). Функция принимает имя канала в качестве первого аргумента и полезную нагрузку в качестве второго. Эта функция намного проще в использовании, чем команда NOTIFY, если вам нужно работать с непостоянными именами каналов и полезными нагрузками.

Спасибо как всегда за помощь

Редактировать: Версия базы данных: «PostgreSQL 9.0.3 на i686-pc-linux-gnu, скомпилированный GCC gcc (GCC) 4.2.4, 32-bit»

1 Ответ

25 голосов
/ 03 марта 2011

Я обсуждал это в списке рассылки PostgreSQL (http://archives.postgresql.org/pgsql-bugs/2011-03/msg00041.php)) и был проинформирован о причинах такого поведения.

Их ответ таков: "... вам нужно заключить в кавычки значения имен (слушайте" Тест ")). если вы хотите, чтобы сервер не обрабатывал их, сложите их. pg_notify принимает строку, а не relname, которая использует другие правила. "(Спасибо, Мерлин и Том)

Это означает, что следующее работает, потому что каналвсегда принудительно вводить нижний регистр

LISTEN ERRORCHANNEL;

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

Если бы вы добавляли двойные кавычки вокруг названия канала, регистр сохранялся бы.

Итак, при следующем вы получите первое уведомлениено не второе:

LISTEN "ERRORCHANNEL";

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

Аналогично, будет работать следующее, потому что двойные кавычки заставляют поддерживать регистр ERRORCHANNEL:

LISTEN "ERRORCHANNEL";

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

Хотя это не будет работать:

LISTEN ERRORCHANNEL;

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

В этой ситуации ERRORCHANNEL не указан в двойных кавычках в команде LISTEN, поэтому PostgreSQL принудительно вводит его в нижнем регистре. Параметр channel имеет тип text ratзатем ее relname, поэтому регистр остается нетронутым в функции pg_notify ().Вместе каналы не совпадают (ERRORCHANNE! = Errorchannel), поэтому уведомление никогда не будет получено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...