2017-04-04 9 views
3

質問に特定のものがあるのか​​どうか不明ですが、Linuxシェルコマンドを実行するPostgres関数を作成する際に問題があります。トリガーは挿入後、私はいくつかのNEW列を使用する必要があります。PostgreSQL関数で引数を指定してシステムコマンドを実行しています

MySQLでは、プラグインを使用すると、「MySQLのUDFは、」それはかなり簡単だった、トリガーはこのように働いている間:

BEGIN 
DECLARE result int(10); 
SET result = sys_exec('/usr/bin/php /var/www/html/.../regras.php NEW.uniqueid NEW.linkedid NEW.eventtype'); 
END 

しかし、PostgreSQLの上で、私は言語PL/SHを試してみました、ウィッヒは、任意のシェルスクリプトを実行できます私は次の関数を書いた:それは適切な方法での.phpファイルを実行し

CREATE FUNCTION tarifador_func2() RETURNS TRIGGER 
    LANGUAGE plsh 
    AS $$ 
    #!/bin/sh 
    /usr/bin/php /var/www/html/...regras.php NEW.uniqueid NEW.linkedid NEW.eventtype 
    $$; 

を、問題は言語がそうargs[]で、私はPHPの引数として与えているNEW変数を認識しないです私が得たものはです,"NEW.linkedid"および"NEW.eventtype"である。

したがって、PL/shでNEW引数を正しく使用するにはどうすればよいですか? もう1つの可能な解決方法は、トリガーを作成する際に引数を使用して必要な3つの値を手動で設定することですが、引数にNEWを使用することはできません。

答えて

2

あなたはplshトリガーで一部値にアクセスすることができます。

  • UPDATEはINSERTのみNEW(当たり前)
  • は、私は、あなたは$ 1のように引数を使用して、これらの値を取得します$ 2

をテストしていないDELETE提供する唯一のOLD

  • を提供しています

    あなたはこのように見えます:

    CREATE FUNCTION tarifador_func2() RETURNS TRIGGER 
    LANGUAGE plsh 
    AS $$ 
    #!/bin/sh 
    /usr/bin/php /var/www/html/...regras.php $3 $6 $1 
    

    $$; plsh拡張子は、彼らがあなたのテーブルに宣言されている順序で引数にALL列をダンプするので、私は$1 $2 $3を使用していない

    通知は、それがあります。だから、INSERT INTO table1 (column3) VALUES (6);のようなものをやって、$3の中にplshというようにすると、これはテーブルの3番目の列とみなされます。

    トリガーのメタデータは、env varsを介して利用できます。

  • +0

    'DELETE'は' OLD'レコードもパラメータとして報告しなければなりません。 (なぜなら、すべてのトリガーイベントでは、['tg_trigtuple'プロパティ](https://www.postgresql。)を使用しています(https://github.com/petere/plsh/blob/a5b310ff397f8178292762b8a353d315efd67644/plsh.c#L458)。 org/docs/current/static/trigger-interface.html))。 - トリガー定義にもパラメータが固定されている場合は、列値の前に来ることになります(これらは非常に文書化されていないようです)。 – pozs

    0

    私が知る限り、PL/shのNEWOLDタプルにアクセスすることはできません。

    私はこの目的でPL/PerlまたはPL/Pythonを使用します。ここで

    は、PL/Pythonでの例です:

    CREATE OR REPLACE FUNCTION pytrig() RETURNS trigger 
        LANGUAGE plpythonu AS 
    $$import os 
    os.system("/usr/bin/php /home/laurenz/hello.php '" + TD["new"]["val"] + "'")$$; 
    
    CREATE TABLE test (id integer PRIMARY KEY, val text); 
    
    CREATE TRIGGER pytrig AFTER INSERT ON test FOR EACH ROW 
        EXECUTE PROCEDURE pytrig(); 
    
    +0

    私はPL/Pythonを使ってみましたが、 "subprocess.call"を実行しても成功しませんでしたが、PHPファイルを実行する例がありますか? –

    +0

    私は簡単な例を追加しました。私はPythonの専門家ではありません。 –

    +0

    @ laurenz-albeありがとう、あなたの解決策はまた私の質問のために正しいです。 –

    関連する問題