如何使用Liquibase更改Oracle和HSQL数据库上的视图(HSQLDB上不支持replaceIfExists)

如何使用Liquibase更改Oracle和HSQL数据库上的视图(HSQLDB上不支持replaceIfExists),oracle,integration-testing,hsqldb,liquibase,Oracle,Integration Testing,Hsqldb,Liquibase,我们使用Liquibase来管理Oracle DB模式。我们还使用HSQL DB进行集成测试。我还想使用Liquibase来构建HSQL模式(它目前是通过java编程构建的——因此我在本例中使用Liquibase java API来触发它) 我们有几个视图变更集,每当其内容发生更改时,这些变更集都会在任何liquibase迁移结束时运行: <changeSet id="VIEW_1" author="A1" runOnChange="true"> <createView

我们使用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 ...

选择
针对HSQL DB的Liquibase不支持
replaceIfExists
,因此此方法失败

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

  • 删除每个视图(如果存在),然后在每次迁移时创建。这是可行的,但即使是很小的更改也会产生大量冗余SQL—它会破坏
    runOnChange

  • 对HSQL DB和Oracle使用重复的变更集-Oracle将使用
    replaceIfExists
    runOnChange
    ,HSQL DB将遵循第一种模式-删除(如果存在),然后创建。这意味着复制我们的视图逻辑

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


  • 找到了!使用
    modifySql
    元素(手册中未链接到该元素!):

    
    选择
    
    找到了!使用
    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>