質問

データベーススキーマの更新を適用するスクリプトに取り組んでいます。 start transaction / commitを使用して、すべてのSQL更新スクリプトをセットアップしました。これらのスクリプトをコマンドラインでpsqlに渡します。

複数のスクリプトを同時に、1つのトランザクションで適用する必要があります。これまでのところ、私が思いついた唯一の解決策は、元のスクリプトセットから開始トランザクション/コミットを削除し、新しい開始トランザクション/コミットブロック内でジャムすることです。これをその場で行うためのperlスクリプトを書いています。

実際には、ネストされたトランザクションが必要です。これは、postgresqlで行う方法がわかりません。

この目的でネストされたトランザクションを実行またはシミュレートする方法はありますか?エラーがあれば自動的に救済するように設定しているので、下位のトランザクションが失敗してもトップレベルのトランザクションを続行する必要はありません。

役に立ちましたか?

解決

さて、SavePointsを使用してpostgresql内でネストされたトランザクションを使用する可能性があります。

このコード例をご覧ください:

CREATE TABLE t1 (a integer PRIMARY KEY);

CREATE FUNCTION test_exception() RETURNS boolean LANGUAGE plpgsql AS
$BEGIN
   INSERT INTO t1 (a) VALUES (1);
   INSERT INTO t1 (a) VALUES (2);
   INSERT INTO t1 (a) VALUES (1);
   INSERT INTO t1 (a) VALUES (3);
   RETURN TRUE;
EXCEPTION
   WHEN integrity_constraint_violation THEN
      RAISE NOTICE 'Rollback to savepoint';
      RETURN FALSE;
END;$;

BEGIN;

SELECT test_exception();
NOTICE:  Rollback to savepoint
 test_exception 
----------------
 f
(1 row)

COMMIT;

SELECT count(*) FROM t1;
 count 
-------
     0
(1 row)

これは少し役立つかもしれません。

他のヒント

私は最終的に問題を帯域外で「解決」しました-perlスクリプトを使用して入力スクリプトを再処理し、開始トランザクション/コミット呼び出しを削除してから、すべてを1つのファイルにプッシュします。トランザクション/コミットを開始します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top