1. 概要

前回の記事では、データベーススキーマとデータを管理するためのツールとしてLiquibaseを紹介しました。

この記事では、ロールバック機能と、Liquibase操作を元に戻す方法について詳しく説明します。

当然、これは実稼働グレードのシステムの重要な機能です。

2. Liquibase移行のカテゴリ

Liquibase操作には2つのカテゴリがあり、ロールバックステートメントの生成が異なります。

  • 自動。移行により、ロールバックに必要なステップが決定論的に生成されます。
  • manual 。移行命令を使用してステートメントを決定論的に識別することができないため、ロールバックコマンドを発行する必要があります。

たとえば、「createtable」ステートメントのロールバックは、作成されたテーブルを「ドロップ」することです。 これは間違いなく決定できるため、ロールバックステートメントを自動生成できます。

一方、「droptable」コマンドのロールバックステートメントを判別することはできません。 テーブルの最後の状態を判別することはできないため、ロールバックステートメントを自動生成することはできません。 これらのタイプの移行ステートメントには、手動のロールバック手順が必要です。

3. 簡単なロールバックステートメントの記述

実行時にテーブルを作成し、変更セットにロールバックステートメントを追加する簡単な変更セットを作成しましょう。

<changeSet id="testRollback" author="baeldung">
    <createTable tableName="baeldung_turorial">
        <column name="id" type="int"/>
        <column name="heading" type="varchar(36)"/>
        <column name="author" type="varchar(36)"/>
    </createTable>
    <rollback>
        <dropTable tableName="baeldung_test"/>
    </rollback>
</changeSet>

上記の例は、上記の最初のカテゴリに分類されます。 ロールバックステートメントを追加しない場合は、ロールバックステートメントが自動的に作成されます。 ただし、ロールバックステートメントを作成することで、デフォルトの動作をオーバーライドできます。

次のコマンドを使用して移行を実行できます。

mvn liquibase:update

実行後、以下を使用してアクションをロールバックできます。

mvn liquibase:rollback

これにより、変更セットのロールバックセグメントが実行され、更新段階で完了したタスクが元に戻されます。 ただし、このコマンドを単独で発行すると、ビルドは失敗します。

その理由は–ロールバックの制限を指定していません。 データベースは、初期段階にロールバックすることで完全に消去されます。 したがって、条件が満たされたときにロールバック操作を制限するには、以下の3つの制約のいずれかを定義する必要があります。

  • rollbackTag
  • rollbackCount
  • rollbackDate

3.1. タグへのロールバック

データベースの特定の状態をタグとして定義できます。 したがって、その状態を参照することができます。 タグ名「1.0」にロールバックすると、次のようになります。

mvn liquibase:rollback -Dliquibase.rollbackTag=1.0

これにより、タグ「1.0」の後に実行されたすべてのチェンジセットのロールバックステートメントが実行されます。

3.2. カウントによるロールバック

ここでは、ロールバックする必要のあるチェンジセットの数を定義します。 これを1つと定義すると、最後に実行されたチェンジセットがロールバックされます。

mvn liquibase:rollback -Dliquibase.rollbackCount=1

3.3. 日付にロールバック

ロールバックターゲットを日付として設定できるため、その日以降に実行された変更セットはすべてロールバックされます。

mvn liquibase:rollback "-Dliquibase.rollbackDate=Jun 03, 2017"

日付形式はISOデータ形式であるか、実行プラットフォームの DateFormat.getDateInstance()の値と一致する必要があります。

4. ロールバックチェンジセットオプション

チェンジセットでのロールバックステートメントの可能な使用法を調べてみましょう。

4.1. マルチステートメントのロールバック

単一のロールバックタグは、実行される複数の命令を囲む場合があります。

<changeSet id="multiStatementRollback" author="baeldung">
    <createTable tableName="baeldung_tutorial2">
        <column name="id" type="int"/>
        <column name="heading" type="varchar(36)"/>
    </createTable>
    <createTable tableName="baeldung_tutorial3">
        <column name="id" type="int"/>
        <column name="heading" type="varchar(36)"/>
    </createTable>
    <rollback>
        <dropTable tableName="baeldung_tutorial2"/>
        <dropTable tableName="baeldung_tutorial3"/>
    </rollback>
</changeSet>

ここでは、同じロールバックタグに2つのテーブルをドロップします。 タスクを複数のステートメントに分割することもできます。

4.2. 複数のロールバックタグ

チェンジセットでは、複数のロールバックタグを持つことができます。 それらは、チェンジセットに表示される順序で実行されます。

<changeSet id="multipleRollbackTags" author="baeldung">
    <createTable tableName="baeldung_tutorial4">
        <column name="id" type="int"/>
        <column name="heading" type="varchar(36)"/>
    </createTable>
    <createTable tableName="baeldung_tutorial5">
        <column name="id" type="int"/>
        <column name="heading" type="varchar(36)"/>
    </createTable>
    <rollback>
        <dropTable tableName="baeldung_tutorial4"/>
    </rollback>
    <rollback>
        <dropTable tableName="baeldung_tutorial5"/>
    </rollback>
</changeSet>

4.3. ロールバックについては別のチェンジセットを参照してください

データベースの詳細を変更する場合は、別の変更セット、おそらく元の変更セットを参照できます。 これにより、コードの重複が減り、行われた変更を正しく元に戻すことができます。

<changeSet id="referChangeSetForRollback" author="baeldung">
    <dropTable tableName="baeldung_tutorial2"/>
    <dropTable tableName="baeldung_tutorial3"/>
    <rollback changeSetId="multiStatementRollback" changeSetAuthor="baeldung"/>
</changeSet>

4.4. 空のロールバックタグ

デフォルトでは、Liquibaseは、提供されていない場合、ロールバックスクリプトを生成しようとします。 この機能を解除する必要がある場合は、ロールバック操作が元に戻らないように、空のロールバックタグを設定できます。

<changeSet id="emptyRollback" author="baeldung">
    <createTable tableName="baeldung_tutorial">
        <column name="id" type="int"/>
        <column name="heading" type="varchar(36)"/>
        <column name="author" type="varchar(36)"/>
    </createTable>
    <rollback/>
</changeSet>

5. ロールバックコマンドオプション

データベースを以前の状態にロールバックする以外に、Liquibaseはさまざまな方法で使用できます。 これらは、ロールバックSQLを生成し、将来のロールバックスクリプトを作成し、最後に、移行とロールバックの両方を1つのステップでテストできます。

5.1. ロールバックスクリプトを生成する

ロールバックと同じように、ロールバックSQLを生成するための3つのオプションがあります。 それらは:

  • rollbackSQL –データベースを上記のタグにロールバックするためのスクリプト
  • rollbackToDateSQL –データベースを上記の日時の状態にロールバックするSQLスクリプト
  • rollbackCountSQL –データベースを前のステップ数で指定された状態にロールバックするSQLスクリプト

実際の例の1つを見てみましょう。

mvn liquibase:rollbackCountSQL 2

5.2. 将来のロールバックスクリプトを生成する

このコマンドは、データベースを現在実行可能なチェンジセットが完了した状態から現在の状態に戻すために必要なロールバックSQLコマンドを生成します。 これは、実行しようとしている変更のロールバックスクリプトを提供する必要がある場合に非常に役立ちます。

これは、実行しようとしている変更のロールバックスクリプトを提供する必要がある場合に非常に役立ちます。

mvn liquibase:futureRollbackSQL

5.3. 更新テストのロールバックを実行する

このコマンドは、データベースの更新を実行してから、変更セットをロールバックして、データベースを現在の状態にします。 将来のロールバックと更新テストのロールバックはどちらも、実行が終了した後、現在のデータベースを変更しません。 ただし、更新テストのロールバックは実際の移行を実行してからロールバックします。

これは、データベースを永続的に変更せずに、更新変更の実行をテストするために使用できます。

mvn liquibase:updateTestingRollback

6. 結論

このクイックチュートリアルでは、Liquibaseロールバック機能のいくつかのコマンドラインとチェンジセット機能について説明しました。

いつものように、ソースコードはGitHubにあります。