これについては、PostgreSQLメーリングリスト(http://archives.postgresql.org/pgsql-bugs/2011-03/msg00041.php)で説明し、動作の理由について通知を受けました。
彼らの答えは、「.. relnamesを二重引用符で囲む必要があります(「Test」をリッスンします)。サーバーで大文字と小文字を区別したくない場合は、pg_notifyは異なるルールを使用するarelnameではなく文字列を取ります。」 (マーリンとトムに感謝します)
これは、チャネルが常に小文字に強制されるため、以下が機能することを意味します
LISTEN ERRORCHANNEL;
NOTIFY ERRORCHANNEL, 'something!';
NOTIFY eRrorChanNel, 'something!';
チャネル名を二重引用符で囲むと、大文字と小文字が区別されます。
したがって、次の場合、最初の通知は受信されますが、2番目の通知は受信されません。
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はそれを小文字に強制します。チャネルパラメータはrelnameではなくtextタイプであるため、pg_notify()関数では大文字と小文字は変更されません。一緒にチャネルが一致しないため(ERRORCHANNE!=errorchannel)、通知が受信されることはありません。