You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加新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前后被意外添加/删除了空白行、空格或制表符
  • 编辑器自动格式化了代码(比如调整了缩进、换行),虽然业务逻辑没变,但文本内容已改变

解决方法

  1. 检查文件格式:确认当前changelog文件的换行格式和之前提交的版本一致(可通过编辑器的右下角查看/切换)
  2. 校验文本差异:用版本控制工具(如Git)对比当前文件和上一次正常运行时的版本,查看是否有空白字符的变化
  3. 重置校验和(谨慎操作):
    • 若确认变更集内容未被篡改,可执行Liquibase命令重置校验和:
      liquibase clearCheckSums
      
    • 或在变更集行添加validCheckSum属性,指定新的校验和值:
      -- changeset Conner:492 splitStatements="false" endDelimiter=";" validCheckSum="8:cd9ef9c9a83fda6b8bd33543b4322bef"
      
    注意:validCheckSum仅用于确认内容无误的情况,不要滥用,避免掩盖真实的代码修改问题。

内容的提问来源于stack exchange,提问作者NorSer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:44:16