2012-04-20 14 views
1

私はブランチで作業しています。たとえば、テーブルXのカラムを削除する必要があります。そのブランチに対して変更とその利点を追加してから、そのカラムが必要な別のブランチに切り替えます。変更をロールバックする必要があります。ブランチからブランチまで、このようなdbには多くの変更があります。Liquibase Auto Rollback

すべてのブランチに新しいchangelog xmlを追加して、それをマスターchangelog xmlに含めます。明らかに私が別のブランチに切り替えると、前のブランチのchanglog xmlはもはやワークスペースになくなり、liquibaseはデータベース内の実際のチェンジセットをその名前と適用時に保存しないので、変更をロールバックすることはできません自動的に。

私はLiquibase Servletを使用してアプリケーションの起動時に変更を適用しています。

Liquibaseの専門家は、すでに実装されているこの問題の簡単な解決法はありますか?ありがとうございました!

+0

1つのデータベースと複数のブランチがありますか?または、それは一時的なデータベースであり、すべてのテスト実行のために新しくなっていますか? – yegor256

+2

あなたはa)各ブランチに1つのDBが必要だと思います。b)各ブランチに1つの変更履歴があります。 –

+0

私は唯一の開発者であるため、各ブランチのチェンジログとすべてのデータベースインスタンスが1つで、複数のデータベースは必要ありません。 – user979051

答えて

2

コードの分岐間で単一のデータベースインスタンスを共有することは困難です。複数の開発者間でデータベースを共有しようとすると、同じ種類の問題が発生します。

Liquibaseはファイルベースのチェンジセットをデータベース変更のマスターレコードとして使用するように設計されています。特殊テーブルDATABASECHANGELOGは、データベースインスタンスにチェンジセットが適用されたトラックを設計したものです。枝の切り替えは、例えば、予測不可能な方法の多くの混乱が発生します。

  • 欠落チェンジ、その内容が変更された(チェックサムエラーにつながる)
  • チェンジ。
  • ...

最高のアドバイスはあなたが枝を切り替えるたびに、データベースを更新または再同期することです:

liquibase dropAll 
liquibase update 

あなたのケースでは第2の動作は、LiquiBaseをサーブレットとしてprobabily不要であるだろう起動時にデータベースを更新します。

データの消失に関する懸念がある場合は、contextsを使用してテストデータを制御してください。

更新

あなたはMavenを使用している場合は、次のようにこの「再同期」操作はMavenのから呼び出すことができます。

mvn -Presync compile 

次のように、このプロファイルは、あなたのPOMの中に設定されています。

<profile> 
     <id>resync</id> 
     <build> 
      <plugins> 
       <plugin> 
        <groupId>org.liquibase</groupId> 
        <artifactId>liquibase-maven-plugin</artifactId> 
        <version>${liquibase.plugin.version}</version> 
        <executions> 
         <execution> 
          <phase>process-resources</phase> 
          <configuration> 
           <url>${liquibase.url}</url> 
           <driver>${liquibase.driver}</driver> 
           <username>${liquibase.username}</username> 
           <password>${liquibase.password}</password> 
           <changeLogFile>${liquibase.changeLogFile}</changeLogFile> 
           <promptOnNonLocalDatabase>false</promptOnNonLocalDatabase> 
          </configuration> 
          <goals> 
           <goal>dropAll</goal> 
           <goal>update</goal> 
          </goals> 
         </execution> 
        </executions> 
       </plugin> 
      </plugins> 
     </build> 
    </profile>