如何使用Liquibase来改变Oracle和HSQL DB上的视图,(HSQLDB不支持replaceIfExists)

时间:2013-10-08 13:37:01

标签: oracle integration-testing hsqldb liquibase

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

我们有几个视图changeSet,只要内容发生变化,就会在任何liquibase迁移结束时运行:

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

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

1 个答案:

答案 0 :(得分:3)

发现它!使用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>