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