在我的项目中,我们使用voltdb作为数据库,使用液化库管理版本等等。我们在一个文件中为voltdb编写了变更集,并使用了RunAlways.xml文件,该文件包含以下步骤:
RunAlways.xml文件在更新现有DB或新DB之后运行。
假设我为任何程序设置的更改是
<changeSet dbms="voltdb" author="foo" id="foo-1" runAlways="true">
<sql>DROP PROCEDURE BAR</sql>
<rollback/>
</changeSet> 现在,我更改了<sql>语句,更改了语句如下所示
<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> 标签来处理。
还有其他解决方案,比如清除校验和命令等等。
如能及时提供协助,将不胜感激。
发布于 2021-09-10 14:23:31
有一个很好的理由认为,runAlways应该忽略校验和错误,但目前并非如此。
添加validCheckSum可能最有意义,所以我建议坚持这样做。这是一种最明确的表达方式:“这种变化可能会不时地改变,这很好”。
在runOnChange="true"之外添加runAlways="true"也是可行的,但是对于阅读changelog文件的人来说,你想要的就不那么明显了。
清空校验和更多的是一次/一次性“一切都变了”的情况,所以不像你所期待的那样定期使用。
先决条件是一种添加逻辑的方法,可以动态地确定变更集是否应该运行。例如,如果您的数据库不支持drop ... if exists语法,那么在尝试将其放到runAlways=true变更集中之前,必须使用一个语法来查看该过程是否存在。
您可以将所有runAlways=true属性替换为先决条件和/或runOnChange=true设置的组合,这些设置动态地检测更改集的新版本和数据库的当前状态,以确定应该运行什么。无论是比runAlways=true更复杂还是不那么复杂,这都是您需要做出的判断。
https://stackoverflow.com/questions/69128037
复制相似问题