首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Liquibase :如何使用<preconditions>和变更集有runAlways真?

Liquibase :如何使用<preconditions>和变更集有runAlways真?
EN

Stack Overflow用户
提问于 2021-09-10 06:20:01
回答 1查看 915关注 0票数 2

在我的项目中,我们使用voltdb作为数据库,使用液化库管理版本等等。我们在一个文件中为voltdb编写了变更集,并使用了RunAlways.xml文件,该文件包含以下步骤:

  • 放弃程序
  • 为所有过程创建一个jar文件
  • 创建一个进行更改的过程
  • 如果需要,创建分区

RunAlways.xml文件在更新现有DB或新DB之后运行。

假设我为任何程序设置的更改是

代码语言:javascript
复制
<changeSet dbms="voltdb" author="foo" id="foo-1" runAlways="true">
        <sql>DROP PROCEDURE BAR</sql>
        <rollback/>
</changeSet> 

现在,我更改了<sql>语句,更改了语句如下所示

代码语言:javascript
复制
<sql>DROP PROCEDURE BAR IF EXISTS</sql>

做完这件事后,我得到了Unable to update database. liquibase.exception.ValidationFailedException: Validation Failed:错误。

根据一个Liquibase博客,如果我们重新格式化<sql>,那么它将影响校验和。

因此,我在<validCheckSum>ANY<validCheckSum> 标签之前添加了<sql>标记。现在,当RunAlways.xml将运行时,它将不会检查checkSum并始终运行我的chnageSet,而不会出现任何错误。

现在我的问题是,我不想使用<validCheckSum>标记,而是希望使用<preconditions>标记,那么我应该如何实现它呢?我在Liquibase博客上发现,我们也可以使用<preconditions> 标签来处理。

还有其他解决方案,比如清除校验和命令等等。

如能及时提供协助,将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-10 14:23:31

有一个很好的理由认为,runAlways应该忽略校验和错误,但目前并非如此。

添加validCheckSum可能最有意义,所以我建议坚持这样做。这是一种最明确的表达方式:“这种变化可能会不时地改变,这很好”。

runOnChange="true"之外添加runAlways="true"也是可行的,但是对于阅读changelog文件的人来说,你想要的就不那么明显了。

清空校验和更多的是一次/一次性“一切都变了”的情况,所以不像你所期待的那样定期使用。

先决条件是一种添加逻辑的方法,可以动态地确定变更集是否应该运行。例如,如果您的数据库不支持drop ... if exists语法,那么在尝试将其放到runAlways=true变更集中之前,必须使用一个语法来查看该过程是否存在。

您可以将所有runAlways=true属性替换为先决条件和/或runOnChange=true设置的组合,这些设置动态地检测更改集的新版本和数据库的当前状态,以确定应该运行什么。无论是比runAlways=true更复杂还是不那么复杂,这都是您需要做出的判断。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69128037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档