【发布时间】:2015-11-25 05:16:54
【问题描述】:
我们在 webapp 中使用 liquibase 3.0.8 已经有一段时间了,并且在应用程序启动时通过 Spring-liquibase bean 应用数据库更新。 我们决定通过 3.1、3.1.1、3.2.0 然后 3.2.3 逐步更新我们的开发数据库,此时更新失败并出现校验和验证错误。我们尝试恢复到 3.2.0,但得到一组不同的校验和错误。 我也尝试过从 3.0.8 直接升级到 3.4.1(撰写本文时的当前版本),并得到相同的校验和错误,
我从 liquibase 发行说明中了解到,3.2.0 中存在计算错误校验和的错误,但我无法选择仅在生产数据库上将受影响的校验和设置为 NULL,因为我们的 webapp 部署在我们无权访问的客户服务器。
这是一个变更集的示例,其校验和在将 liquibase 更新到任何晚于 3.2.0 的版本时失败。
<changeSet author="xxxxx" id="16042015">
<preConditions onFail="MARK_RAN">
<sqlCheck expectedResult="0">select count(*) from Organisation</sqlCheck>
</preConditions>
<comment>Add Organisation table</comment>
<loadData tableName="Organisation" file="sqlUpdates/data/organisations.csv">
<column name="id" type="NUMERIC" />
<column name="title" type="STRING"/>
<column name="approved" type="NUMERIC"/>
</loadData>
如果您能就解决此问题的最佳方式提供任何建议,我们将不胜感激。以下是我们目前的想法,所有这些想法都有很大的缺陷:
1) 我们可以创建一个新的变更集文件,在任何其他文件之前运行,其中包含一个变更集,它将在更新开始之前将所有校验和设置为空,以首先阻止错误的发生。这远非理想,因为我们不再能够确定其他语句没有真正被改变。
2) 告诉客户执行一些 SQL 语句以将相关变更集校验和设置为 null - 这也远非理想,因为我们的许多客户不精通 MySQL,可能会搞砸。
3) 根本不要更新 liquibase 并坚持使用最新的 3.1 版本 - 再次,不理想
谢谢!理查德
【问题讨论】:
-
sql 怎么说:使用 OPTION updateSQL