2012-05-08 15 views
0

職場のアプリケーション用にフライウェイプロジェクトを作成しました。テストの準備が整う前に、開発者の一人がすでにTESTでいくつかのSQL文を実行していました。flyway:SQL文が失敗してもマイグレーションを強制する

ALTER TABLE "TABLE1" MODIFY ("NAME" VARCHAR2(75 CHAR)); 
ALTER TABLE "TABLE2" DROP ("BOARD_ID"); 
ALTER TABLE "TABLE3" ADD CONSTRAINT "SYS_C0022270" CHECK ("ID" IS NOT NULL) ENABLE; 

文#2にドロップする必要があるカラムは、すでに我々のテストインスタンスに手動で削除されました:

私のSQLスクリプトは、いくつかの文を持っています。私たちのPRODインスタンスにはドロップされていません。私は手動ではなくマイグレーションによってそれをやりたいのです。

明らかに、私はPROD上でTESTを最初に試してみることはありません(これらの3つのクエリよりも多くのことがあります)。

しかし、私が問題を抱えている移行が最初の行であるため、続行できません。

強制する方法はありますか?私はその列が既に削除されていることを知っています。私はそれをもう一度作成して、マイグレーションでそれを削除することができます。しかし、私は失敗する可能性がある行の下に他のクエリがあるかもしれません(すでに存在する可能性のあるシードデータの作成など)。そして私はそれが私たちの展開を止めることを望んでいません。

私たちのDBをPRODから再度クローンし、開発チームが開発を中止して新しい移行セットを準備する以外のアイデアはありますか?

答えて

1

その音で、の列を作り直すと、実際にはのように聞こえます。

これは非常に簡単で、唯一の目的は、その後すぐに再び落とすようにすることです。絶対に無害です。

私はストーリーの一部を見逃していない限り、将来のシードデータの作成がこれとどのように矛盾するかを理解していません。

もちろん、長期的な解決策は、開発文化の変更であり、手動DB変更の完全な禁止です。

+0

シード・データの競合の例を示します。データベースに格納されているジャスパー・テンプレートを指すオブジェクトがいくつかあります。複数のレコードがそのテンプレートを指しています。各オブジェクトのSQLスクリプトには、テンプレートが存在しない場合に作成するためのクエリがあります。 (開発の時点で、どのオブジェクトが先に展開されるのかは不明であったため)。最初のスクリプトが実行された後、既に挿入されているため、実際には気にしない単一のクエリが原因で他のすべてのスクリプトが失敗します。 – robertrv

+0

私は各ファイルからクエリを削除し、それを独立したスクリプトにする必要があることを知っています。しかし、失敗したクエリを無視する方法も有効でした。さて、私たちのユニークな必要性のためにこのような機能を実装することはお勧めしません。似たようなものがあるのか​​どうか疑問に思っていただけです。 – robertrv

+0

これは落とした列とは何が関係していますか?それとも、これは多くの人の中の一例ですか? –

0

あなたは、あなたが先頭に次のステートメントを追加することができ、あなたのスクリプトを実行します。sqlplusを使用している場合:あなたはあなたが持つPL/SQLブロック内のエラーを無視する任意のSQL文を置くことができます

WHENEVER SQLERROR CONTINUE 
+0

これはうまくいかなかった: 'ORA-00900:無効なSQL文 '。私はそれがSQL * Plusのみの構造だと思っています。 – robertrv

4

例外ハンドラ:

BEGIN 
    EXECUTE IMMEDIATE 'ALTER TABLE "TABLE1" MODIFY ("NAME" VARCHAR2(75 CHAR))'; 
EXCEPTION 
    WHEN OTHERS THEN 
    -- perhaps print a message about the command failure here 
END; 
/

DDLは、PL/SQL内で即時実行文の中で実行する必要があります。

少し痛いですが、うまくいくはずです。

+0

ありがとう!これは動作します。フライウェイは、 "DBMS_OUTPUT.PUT_LINE()"が返すものを返すようには見えません。私はsqlplusを使って単純なスクリプトを作成します。今後のリリースでPROD dbを再クローンしてもう一度やり直してください。 – robertrv

+0

utl_fileを使用してメッセージをファイルに書き込むこともできます。 – DCookie

0

SQLERRORが継続し、フライウェイと DBMS_OUTPUT.PUT_LINE()does'nt仕事WHENEVERそれは特定のSQLPLUSクライアントである、あなたはフライウェイは、移行プロセスを停止し、ログに問題を印刷します

EXCEPTION 

WHEN OTHERS THEN 

DBMS_OUTPUT.PUT_LINE(SQLERRM || CHR(10) ||DBMS_UTILITY.FORMAT_ERROR_BACKTRACE); 

ROLLBACK; 

Raise_Application_Error (-20000, SQLERRM || ' : ' ||DBMS_UTILITY.FORMAT_ERROR_BACKTRACE); 

END; 

RAISEを使用することができます。

移行を続行したい場合は、ユーザーは別の印刷ソリューションを提案してください。 はフライウェイ4.0でテスト済みです。3

関連する問題