【问题标题】:How to use Liquibase to alter views on both Oracle and HSQL DBs, (replaceIfExists not supported on HSQLDB)如何使用 Liquibase 更改 Oracle 和 HSQL DB 上的视图(HSQLDB 不支持 replaceIfExists)
【发布时间】:2013-10-15 11:12:42
【问题描述】:

我们使用 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 使用重复的变更集 - Oracle 将使用 replaceIfExistsrunOnChange,HSQL DB 将遵循第一个模式 - 如果存在则删除,然后创建。这意味着复制我们的视图逻辑。

  3. 检查 liquibase 代码并尝试在 HSQL DB 上支持 replaceIfExists - Liquibase 可以发出 drop view 命令,而不是依赖底层 DB 来处理它。很好,但我没时间!

【问题讨论】:

标签: oracle integration-testing hsqldb liquibase


【解决方案1】:

找到了!使用modifySql 元素(手册中没有链接到documentation page!):

<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>

【讨论】:

    猜你喜欢
    • 2016-08-12
    • 2019-11-30
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    相关资源
    最近更新 更多