在我的项目中,我们使用 voltdb 作为数据库,并使用 liquibase 来管理版本等。我们在一个文件中为 voltdb 编写变更集,并使用 RunAlways.xml 文件,其中包含以下步骤
- 删除一个过程
- 为所有过程创建一个 jar 文件
- 创建一个完成更改的过程
- 根据需要创建分区
RunAlways.xml 文件在更新现有数据库或新数据库后运行。
假设我对任何过程的更改集是
<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 blog如果我们重新格式化 <sql>
那么它会影响校验和。
所以我添加<validCheckSum>ANY<validCheckSum>
之前的标签 <sql>
tag 。现在,当 RunAlways.xml 运行时,它不会检查 checkSum
并始终运行我的 chnageSet
没有任何错误。
现在我的问题是,而不是 <validCheckSum>
我想使用 <preconditions>
标签标签,那么我应该如何实现呢?我在 Liquibase blog 上找到的我们可以使用<preconditions>
来处理tag还有。
还有其他解决方案,例如 clearchecksums命令等
我们将非常感谢及时提供帮助。
最佳答案
有一个很好的论点认为 runAlways 应该忽略校验和错误,但目前还没有。
添加 validCheckSum
可能是最有意义的,所以我建议坚持这样做。这是“此变更集可能会不时更改,但这很好”的最明确方式。
除了 runAlways="true"
之外添加 runOnChange="true"
也可以,但对于阅读变更日志文件的人来说不太明显正在打算。
清除校验和更适合一次性/一次性“一切都改变了”的情况,因此不像您似乎正在寻找的那样定期使用。
先决条件是一种添加逻辑以动态确定变更集是否应该运行的方法。例如,如果您的数据库不支持 drop ... if contains
语法,则在尝试将过程删除到 runAlways= 之前,您必须使用语法来查看该过程是否存在。 true
变更集。
您可以将所有 runAlways=true
属性替换为先决条件和/或 runOnChange=true
设置的组合,这些设置可以动态检测变更集的新版本和数据库的当前状态来确定应该运行什么。无论它比 runAlways=true
更复杂还是更简单,您都需要做出判断。
关于液体碱 : How to use <preconditions> with changeset having runAlways true?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69128037/