【问题标题】:Liquibase - checksum differs with different database vendorsLiquibase - 校验和因不同的数据库供应商而异
【发布时间】:2014-11-13 17:40:11
【问题描述】:

当我尝试在 MSSQL 和 MySQL 上运行 Liquibase 校验和时遇到问题。

在我的 MSSQL 库中,我有一个带有此校验和的更改日志条目:

3:cf2f5de7a1dcc738bbc185e25fbcf6c9

当我针对这个数据库运行我的 liquibase 时,它​​工作得很好。

然后,我将更改日志条目复制到我的 MySQL 数据库并尝试运行,并收到此错误:

myLiquibase.xml::1::Tobb is now: 3:cedf7a8ba54ea3f83141f79

我尝试在我的 MSSQL 中将校验和设置为 null 以重新生成校验和,然后校验和恢复为

3:cf2f5de7a1dcc738bbc185e25fbcf6c9

当在 MySQL 中做同样的事情时,我得到了这个校验和:

3:cedf7a8ba54ea3f83141f7987007deb7

因此,据我所知,根据它是在 MSSQL 还是 MySQL 中运行,Liquibase 会生成不同的校验和。这怎么可能发生?我以为校验和只取决于 liquibase-script 的实际内容?

【问题讨论】:

    标签: java mysql sql sql-server liquibase


    【解决方案1】:

    是的,它取决于内容和 DB 类型,因为实际上校验和不取决于您的 changeset 文本,而是取决于为当前 DB 生成的 sql,它不同的数据库会略有不同。

    如果你想避免校验和错误,你可以在变更集中使用validCheckSum标签。

    【讨论】:

    • 我明白了,但是validCheckSum 会一起禁用校验和检查吗?知道脚本已在其当前状态下运行,它将消除一些安全性..
    【解决方案2】:

    校验和实际上是根据变更集文本的规范化版本计算的,而不是 SQL,并且应该与数据库类型无关。

    您是否针对不同的数据库在不同的操作系统版本上运行?

    【讨论】:

    • MySQL 正在本地运行,在 Windows7 64 位上。 MSSQL 在 Windows Server 2008 R2 上运行。我们使用的是 Liquibase 2.0.1 版。可能是因为覆盖了数据类型?
    • 谢谢,Windows 7 vs. 2008r2 不应该影响校验和。你如何覆盖数据类型?只是允许 liquibase 像往常一样转换它们,还是使用更改日志参数?
    • 我们使用的是 modifySql-element:<modifySql dbms="mysql"> <replace replace="NUMBER(19,0)" with="bigint(20)"/> </modifySql>
    • 好的。我不记得这如何影响 2.0 中的校验和,但可能是问题所在。如果您像@Andremoniy 建议的那样使用 ,您可以只列出已知有效的校验和,它仍然会在所有其他校验和上失败。
    • 这不是大量的更改,我通过手动确保所有更改都生效(它是本地数据库,因此架构由 Hibernate 生成),然后将所有更改都归零校验和,以便将它们设置为适当的值。我想升级 Liquibase-version 应该在我的 TODO 列表中..
    猜你喜欢
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 2015-05-30
    • 2015-03-31
    相关资源
    最近更新 更多