Liquibase:如何将 <preconditions> 与具有 runAlways true 的变更集一起使用?
Liquibase : How to use <preconditions> with changeset having runAlways true?
在我的项目中,我们使用 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>
标签那么它会影响校验和。
所以我在 <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
更复杂或更不复杂是你做出的判断。
在我的项目中,我们使用 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>
标签那么它会影响校验和。
所以我在 <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
更复杂或更不复杂是你做出的判断。