sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLでpg_notify(text、text)を使用してLISTEN / NOTIFY

    これについては、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)、通知が受信されることはありません。




    1. SQLCOALESCE関数の実用的な使用

    2. CakePHP 3の複数の列で2つのテーブルを結合するにはどうすればよいですか?

    3. WHERE句で変数を使用する

    4. plsqlで即時実行