我们使用 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
,所以这种方法失败了。
我可以看到一些选项,但它们都很丑陋。有没有人找到更好的方法?
如果存在,则删除每个视图,然后在每次迁移时创建。这可行,但即使是很小的更改也会产生大量冗余 SQL - 它会中断
runOnChange
。为 HSQL DB 和 Oracle 使用重复的 changeSets - Oracle 将使用
replaceIfExists
andrunOnChange
,而 HSQL DB 将遵循第一个模式 - 如果存在则删除,然后创建。这意味着复制我们的视图逻辑。浏览 liquibase 代码并尝试支持
replaceIfExists
HSQL DB - Liquibase 可以发出 drop view 命令,而不是依赖底层 DB 来处理它。不错,就是没时间!