我们使用 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
,因此此方法失败。
我可以看到一些选项,但它们都很丑。有没有人找到更好的方法?
在每次迁移时删除每个 View (如果存在),然后创建。这可行,但即使是很小的更改也会创建大量冗余 SQL - 它会破坏
runOnChange
。对 HSQL DB 和 Oracle 使用重复的变更集 - Oracle 将使用
replaceIfExists
和runOnChange
,HSQL DB 将遵循第一个模式 - 如果存在则删除,然后创建。这意味着复制我们的 View 逻辑。检查 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/