Liquibase:如何将 <preconditions> 与具有 runAlways true 的变更集一起使用?

Liquibase : How to use <preconditions> with changeset having runAlways true?

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

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> 标签那么它会影响校验和。

所以我在 <sql> tag 之前添加 <validCheckSum>ANY<validCheckSum> 标签。现在,当 RunAlways.xml 将 运行 时,它不会检查 checkSum 和 运行总是我的 chnageSet 没有任何错误。

现在我的问题是,我想使用 <preconditions> 标签而不是 <validCheckSum> 标签,那么我应该如何实现呢?我也在 Liquibase blog that we can handle using <preconditions> tag 上找到了。

还有其他的解决方案,比如clearchecksums命令等等

我们将不胜感激。

有一个很好的论点,即运行总是应该忽略校验和错误,但目前它不会。

添加 validCheckSum 可能是最合理的,所以我建议坚持这样做。这是最明确的说法“这个变更集可能会不时发生变化,这很好”。

runAlways="true" 之外添加 runOnChange="true" 也可以,但对于阅读更改日志文件的人来说,您的意图不太明显。

Clear-checksums 更适用于 one-time/one-off“一切都已更改”的情况,因此不像您正在寻找的那样可以定期使用。

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

您可以将所有 runAlways=true 属性替换为先决条件 and/or runOnChange=true 设置的组合,这些设置动态检测新版本的变更集和数据库的当前状态确定应该 运行。这是否比 runAlways=true 更复杂或更不复杂是你做出的判断。