2016-06-30 11 views
0

トランザクションに基づいてPostgreSQLでトリガを強制的に実行できるかどうかは疑問でした。トランザクションごとにPostgresトリガを実行し、各更新操作では実行しない

私は(forループ内から)pythonスクリプトからレコードを更新しています。更新操作時にレコードをテーブルに挿入するトリガがあります。今、私はトランザクション全体に基づいて1つのレコードを挿入し、Pythonスクリプト内から更新しているすべてのレコードに対しては挿入しません。

これを行う方法はありますか?

+0

BEGINとCOMMITの間に一連の更新文がある場合、私はこのために一度だけトリガを呼びたいと思います。このようなシナリオを検出する方法はありますか? – akashag26

答えて

0

それは少し不格好だが、あなたは条件付きトリガーでこれを行うことができます。

CREATE TRIGGER t 
AFTER UPDATE ON MyTable 
FOR EACH ROW 
WHEN (IsFirstCallForThisTransaction()) 
EXECUTE PROCEDURE MyTrigger(); 

トリッキーなビットがIsFirstCallForThisTransaction()を定義しています。内部的にはフラグをどこかに設定する必要がありますが、このフラグが現在のトランザクションにスコープされていることも保証する必要があります。

SET LOCALを使用してcustom configuration variableを割り当てることもできます。 、

my_vars.trigger_called_in_current_transaction = false 

または代わりに問題のデータベースにデフォルトを付ける:あなたはこのラインサーバーのpostgresql.confファイルを置くことによって、この変数を初期化することができます

ALTER DATABASE MyDB SET my_vars.trigger_called_in_current_transaction = false; 

次に、関数は次のようになります。

CREATE FUNCTION IsFirstCallForThisTransaction() RETURNS BOOLEAN AS 
$BODY$ 
BEGIN 
    IF current_setting('my_vars.trigger_called_in_current_transaction')::boolean THEN 
    RETURN false; 
    ELSE 
    SET LOCAL my_vars.trigger_called_in_current_transaction TO true; 
    RETURN true; 
    END IF; 
END 
$BODY$ 
LANGUAGE plpgsql VOLATILE; 
関連する問題