2017-05-22 11 views
1

質問:Oracle DBでDDL文の自動コミットを無効にする方法はありますか?フライウェイを使用してddlをoracleでロールバックする

コンテキスト: 私はFlyway 4を使用してOracle DBの状態を維持しています。 faq pageのように、DDLはこのDBに自動コミットされるため、OracleではDDLの変更をロールバックできません。

たとえば、テーブルから別のテーブルにカラムを移動しています(既存の値をコピーしています)。だから、私は同じSQLファイルにALTER TABLE ADD、UPDATE、そしてALTER TABLE DROPを持っていたいと思います。 DROPステートメントでエラーが発生しましたが、最初のALTER TABLEによって追加された列はそのまま残りました。私もその変更をロールバックできるようにしたいと思います。

私が使用している1つの回避策は、DDL文ごとに個別のSQLファイルを追加することです。しかし、これは醜いです。これを行う他の方法?

+3

誰かがあなたにdownvoteを与えた理由はわかりませんが、とにかくOracleエンジンはそのように動作します。すべてのDDLとDCLは自動的にコミットされます。これは、多くのOracleスクリプトでよく起こるエラーであり、偶然にもすべてのデータをコミットします。 –

+0

シナリオでは、どのようなアクションをロールバックしたいのですか? – APC

+0

質問を編集しました:ALTER TABLE DROPでエラーが発生した場合、新しい列が追加されたままになりました。私はそれらを削除したいと思います。可能であれば、多くのファイルとこれに取り組んでいる多くの同僚がいるため(各自のファイルにステートメントを追加することを忘れるかもしれない)、各SQLファイルでは行われないことがあります。 – GabiM

答えて

0

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

flywayは単にマイグレーションファイルを実行するだけで、アノニマスPL SQLブロックをそこに置くことができます。これらを使用して、PL SQLの例外を介してエラーを管理し、以前のすべての手順を元に戻すことができます。複数の列を操作する場合は、各列を個別のファイルにする必要があります。または、すべての列をロールバックする必要があります。単一列の

擬似コードは:あなたが見ることができるように

declare 
begin 
    -- alter table add new column 
    exception when others then 
     dbms_output.put_line('Exception adding new column'); 
     -- nothing to rollback as failed on first step 
    end;  

    -- update copy data to new column 
    exception when others then 
     dbms_output.put_line('Exception when populating new column'); 
     -- delete any data in new column if committed in blocks 
     -- drop new column 
    end;  

    -- drop old column 
    exception when others then 
     dbms_output.put_line('Exception when dropping old column'); 
     -- ? not sure if you can rollback a failed drop column 
     -- delete any data in new column if committed in blocks 
     -- drop new column 
    end;  

end; 
/

これは努力のビットです。同僚と複数のSQLファイルを避けたい理由と、これがデータベースにのみ影響を与えるかどうかの説明を拡張する必要があるかもしれません。

関連する問題