11

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

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

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

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

4

2 に答える 2

6

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)

多分これはあなたを少し助けるでしょう。

于 2008-10-15T12:56:18.070 に答える
0

私は自分の問題を帯域外で「解決」することになりました-perlスクリプトを使用して入力スクリプトを作り直し、開始トランザクション/コミット呼び出しを排除してから、それらすべてを1つのファイルにプッシュします。これにより、独自の開始トランザクションが取得されます/専念。

于 2008-10-16T14:25:08.250 に答える