oracle - 如何使用 Liquibase 更改 Oracle 和 HSQL DB 上的 View (HSQLDB 不支持 ReplaceIfExists)

标签 oracle integration-testing hsqldb liquibase

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

我们有几个 View 更改集,每当其内容发生更改时,它们都会在任何 liquibase 迁移结束时运行:

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

Liquibase for HSQL DB 不支持 replaceIfExists,因此此方法失败。

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

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

  2. 对 HSQL DB 和 Oracle 使用重复的变更集 - Oracle 将使用 replaceIfExistsrunOnChange,HSQL DB 将遵循第一个模式 - 如果存在则删除,然后创建。这意味着复制我们的 View 逻辑。

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

最佳答案

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

关于oracle - 如何使用 Liquibase 更改 Oracle 和 HSQL DB 上的 View (HSQLDB 不支持 ReplaceIfExists),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19249246/

相关文章:

java - 如何在Hsql中进行外连接

oracle - 如何使用 tnsname 从 Ant 连接到 Oracle 数据库?

sql - 仅备份 SQL 架构?

sql - 使用ORDER BY选择COUNT(*)

java - 如何基于gradle进行资源和java文件夹测试

testing - 在 GET 和 DELETE 采样器之间分组采样器

mysql - Oracle中如何转换日期?

c# - 测试时尝试将 C# 代码与底层数据库隔离可以得到什么好处?

database - Grails 应用程序的每个 cloudfoundry 部署都丢失了数据库数据

java - 是否有为 Java EE 容器定义 JDBC 数据源的标准方法?