2

Liquibase を使用して、Oracle DB スキーマを管理しています。また、統合テストには HSQL DB を使用します。Liquibase を使用して HSQL スキーマも構築したいと考えています (現在は Java からプログラムで構築されているため、このインスタンスでトリガーするために Liquibase Java API を使用しています)。

コンテンツが変更されるたびに、liquibase 移行の最後に実行されるいくつかのビュー changeSet があります。

<changeSet id="VIEW_1" author="A1" runOnChange="true">
    <createView viewName="VIEW_1" replaceIfExists="true">
        SELECT ...

HSQL DB の Liquibase は をサポートしていないためreplaceIfExists、このアプローチは失敗します。

いくつかのオプションを見ることができますが、それらはすべて醜いです。誰かがより良いアプローチを見つけましたか?

  1. 各ビューが存在する場合は削除してから、移行のたびに作成します。これは機能しますが、小さな変更でも膨大な量の冗長 SQL が作成され、破損しrunOnChangeます。

  2. HSQL DB と Oracle に重複した changeSet を使用します - Oracle は and を使用replaceIfExistsrunOnChange、HSQL DB は最初のパターンに従います - 存在する場合はドロップしてから作成します。これは、ビュー ロジックを複製することを意味します。

  3. Liquibase コードを調べてreplaceIfExists、HSQL DB でのサポートを試みます。Liquibase は、それを処理するために基礎となる DB に依存するのではなく、ドロップ ビュー コマンドを発行できます。いいけど時間がない!

4

1 に答える 1

4

それを見つけた!要素を使用しmodifySqlます (そのドキュメント ページはマニュアルにリンクされていません!):

<changeSet id="VIEW_1" author="A1" runOnChange="true">

    <createView viewName="VIEW_1">
        SELECT ...
    </createView>

    <modifySql dbms="oracle">
        <replace replace="CREATE VIEW" with="CREATE OR REPLACE VIEW"/>
    </modifySql>

</changeSet>
于 2013-10-08T17:10:41.403 に答える