リキベースロールバックの紹介

1概要

リンク:/liquibase-refactor-schema-of-java-app[前回の記事]では、データベースのスキーマとデータを管理するためのツールとしてLiquibaseを紹介しました。

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

当然、これはあらゆるプロダクショングレードシステムの重要な機能です。

2リキベース移行のカテゴリ

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

  • 自動 。マイグレーションによって確定的にステップが生成される

ロールバックに必要 manual ** 、マイグレーションのためロールバックコマンドを発行する必要がある場所

命令を使用してステートメントを確定的に識別することはできません

たとえば、** 「create table」 文のロールバックは、「 drop」 「作成された表」となります。これは間違いなく判断できるため、ロールバック文を自動生成できます。

一方、 "drop table" コマンドのロールバック文は決定できません 。テーブルの最後の状態を判断することはできません。したがって、ロールバックステートメントは自動生成できません。この種の移行ステートメントでは、手動のロールバック手順が必要です。

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の生成、将来のロールバックスクリプトの作成、そして最後に、移行とロールバックをテストすることができます。

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

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

  • rollbackSQL <tag> - データベースをデータベースにロールバックするためのスクリプト

言及されたタグ rollbackToDateSQL ** <date/time> - ロールバックするSQLスクリプト

指定された日時におけるデータベース rollbackCountSQL ** <値> - データベースをロールバックするためのSQLスクリプト

前のステップ数で述べた状態に

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

mvn liquibase:rollbackCountSQL 2

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

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

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

mvn liquibase:futureRollbackSQL

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

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

データベースを永久に変更することなく、更新の変更の実行をテストするためにこれを使用することができます。

mvn liquibase:updateTestingRollback

6. 結論

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

いつものように、ソースコードはhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/liquibase[over the GitHub]にあります。