トランザクションに基づいてPostgreSQLでトリガを強制的に実行できるかどうかは疑問でした。トランザクションごとにPostgresトリガを実行し、各更新操作では実行しない
私は(forループ内から)pythonスクリプトからレコードを更新しています。更新操作時にレコードをテーブルに挿入するトリガがあります。今、私はトランザクション全体に基づいて1つのレコードを挿入し、Pythonスクリプト内から更新しているすべてのレコードに対しては挿入しません。
これを行う方法はありますか?
トランザクションに基づいてPostgreSQLでトリガを強制的に実行できるかどうかは疑問でした。トランザクションごとにPostgresトリガを実行し、各更新操作では実行しない
私は(forループ内から)pythonスクリプトからレコードを更新しています。更新操作時にレコードをテーブルに挿入するトリガがあります。今、私はトランザクション全体に基づいて1つのレコードを挿入し、Pythonスクリプト内から更新しているすべてのレコードに対しては挿入しません。
これを行う方法はありますか?
それは少し不格好だが、あなたは条件付きトリガーでこれを行うことができます。
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;
BEGINとCOMMITの間に一連の更新文がある場合、私はこのために一度だけトリガを呼びたいと思います。このようなシナリオを検出する方法はありますか? – akashag26