2

我们使用 Liquibase 来管理我们的 Oracle DB 模式。我们还使用 HSQL DB 进行集成测试。我也想使用 Liquibase 来构建 HSQL 模式(它目前是从 java 以编程方式构建的——所以我在这个实例中使用 Liquibase java API 来触发它)。

我们有几个视图更改集,只要它们的内容发生更改,它们就会在任何 liquibase 迁移结束时运行:

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

Liquibase for HSQL DB 不支持replaceIfExists,所以这种方法失败了。

我可以看到一些选项,但它们都很丑陋。有没有人找到更好的方法?

  1. 如果存在,则删除每个视图,然后在每次迁移时创建。这可行,但即使是很小的更改也会产生大量冗余 SQL - 它会中断runOnChange

  2. 为 HSQL DB 和 Oracle 使用重复的 changeSets - Oracle 将使用replaceIfExistsand runOnChange,而 HSQL DB 将遵循第一个模式 - 如果存在则删除,然后创建。这意味着复制我们的视图逻辑。

  3. 浏览 liquibase 代码并尝试支持replaceIfExistsHSQL DB - Liquibase 可以发出 drop view 命令,而不是依赖底层 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 回答