添加新changeset至Liquibase变更日志时触发校验和错误排查
Liquibase未修改旧变更集却触发校验和错误的原因及解决
问题背景
我在Liquibase中完成最近一次修改后,添加任何新内容都会触发校验和错误。我不太熟悉Liquibase的使用,恳请帮忙排查原因。
旧变更集(ID:492)
-- changeset Conner:492 splitStatements="false" endDelimiter=";" :/ CREATE PROCEDURE dbo.UpdateOrInsertWinningColorsAnswers(@json NVARCHAR(max)) AS BEGIN SET NOCOUNT ON MERGE INTO WinningColorsAnswer W USING( SELECT * FROM OPENJSON(@json) WITH( Id int, Answer varchar(max), QuestionId int, SectionId int, StudentChallengeMappingId int, CreatedDate datetime2, CreatedUser varchar(20), UpdatedDate datetime2, UpdatedUser varchar(20), IsDeleted bit ) ) as InputJSON (Id, Answer, QuestionId, SectionId, StudentChallengeMappingId, CreatedDate, CreatedUser, UpdatedDate, UpdatedUser, IsDeleted) ON(W.StudentChallengeMappingId = InputJSON.StudentChallengeMappingId and W.QuestionId = InputJSON.QuestionId) WHEN MATCHED THEN UPDATE SET W.Answer = InputJSON.Answer, W.UpdatedDate = Convert(datetime, InputJSON.UpdatedDate, 104), W.UpdatedUser = InputJSON.UpdatedUser WHEN NOT MATCHED THEN INSERT(Answer,QuestionId,SectionId,StudentChallengeMappingId,CreatedDate,CreatedUser,UpdatedDate,UpdatedUser,IsDeleted) VALUES(InputJSON.Answer, InputJSON.QuestionId, InputJSON.SectionId, InputJSON.StudentChallengeMappingId, Convert(datetime, InputJSON.CreatedDate, 104), InputJSON.CreatedUser, Convert(datetime, InputJSON.UpdatedDate, 104), InputJSON.UpdatedUser, Cast(InputJSON.IsDeleted as bit)) ; END /
新添加的变更集(ID:493)
-- changeset Conner:493 -- code down here -- -- -- -- --
错误信息
Unexpected error running Liquibase: Validation Failed:
1 change sets check sum
changelog.mssql.sql::492::Conner was: 8:0bde397236550cd1a364241c50171677 but is now: 8:cd9ef9c9a83fda6b8bd33543b4322bef
原因分析
虽然你没有修改变更集492的业务代码,但Liquibase的校验和是基于变更集的完整文本内容计算的,包括空白字符、换行符、注释等。触发校验和变化的常见原因有:
- 文件换行格式变更:比如从Windows的CRLF(回车+换行)切换为Linux的LF(仅换行),或反之
- 变更集492前后被意外添加/删除了空白行、空格或制表符
- 编辑器自动格式化了代码(比如调整了缩进、换行),虽然业务逻辑没变,但文本内容已改变
解决方法
- 检查文件格式:确认当前changelog文件的换行格式和之前提交的版本一致(可通过编辑器的右下角查看/切换)
- 校验文本差异:用版本控制工具(如Git)对比当前文件和上一次正常运行时的版本,查看是否有空白字符的变化
- 重置校验和(谨慎操作):
- 若确认变更集内容未被篡改,可执行Liquibase命令重置校验和:
liquibase clearCheckSums - 或在变更集行添加
validCheckSum属性,指定新的校验和值:-- changeset Conner:492 splitStatements="false" endDelimiter=";" validCheckSum="8:cd9ef9c9a83fda6b8bd33543b4322bef"
validCheckSum仅用于确认内容无误的情况,不要滥用,避免掩盖真实的代码修改问题。 - 若确认变更集内容未被篡改,可执行Liquibase命令重置校验和:
内容的提问来源于stack exchange,提问作者NorSer
相关产品推荐
相关产品推荐

