KB2979121 - 修复:从 SQL Server 2008 升级到 SQL Server 2012 或 SQL Server 2014 时,日志读取器代理失败

应用对象
SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use)

症状

假设您在 Microsoft SQL Server 2008 中使用事务复制,并且该发布上正在运行更新查询。 将 SQL Server 升级到 SQL Server 2012 或 SQL Server 2014 且升级前未分发更新查询时,日志读取器代理可能会失败,并出现以下错误:

注意

<日期></时间> 发布者: {call sp_replcmds (500, 0, 0, , 0, 500000) }
<日期></时间>状态:0,代码:20011,文本:“进程无法在'<发布者名称>'上执行'sp_replcmds'。”。
<日期></时间> 进程无法对“<发布者名称>”执行“sp_replcmds”。
<日期><时间> Repl 代理状态:6
<Date><Time> Status: 0, code: 542, text: '遇到无效的日期时间值。 价值超过 9999 年。
<日期></时间> 状态:0,代码:3621,文本:“该声明已终止。”。
<日期></时间>状态:0,代码:22037,文本:“进程无法在'<发布者名称>'上执行'sp_replcmds'。”。

即使未发生此问题,更新语句的升级日志记录仍可能被日志读取器代理误解,并且可能会在分发代理中出现以下错误:

注意

515 无法将值 NULL 插入“列名称>”列<、表“表>名称<”;列不允许空值。 更新失败。

注意

  • 不同的数据类型和约束可能会导致报告不同的错误,这个问题甚至会导致不收敛。
  • 从 SQL Server 2008 或 SQL Server 2008 R2 升级到 SQL Server 2012 或 SQL Server 2014 时,会出现此问题。

      

解决方法

如果出现错误“515 无法将值 NULL 插入'列名称>'列<、表'表>名称<';列不允许空值。 更新失败分发代理“,则应重新初始化复制。 此修补程序无法修复此错误。 若要避免此错误,应在升级前禁用日志读取器代理,然后一直升级到此修补程序,然后重新启用日志读取器代理。
此问题已首先在 SQL Server 的以下累积更新中修复。

SQL Server 2012 SP2 累积更新 2 /en-us/help/2983175

SQL Server 2014 累积更新 3 /en-us/help/2984923

SQL Server 2012 SP1 累积更新 11 /en-us/help/2975396

关于 SQL Server 的累积更新

SQL Server 的每个新累积更新都包含上一个累积更新中包含的所有修补程序和所有安全修补程序。 查看 SQL Server 的最新累积更新:

      

状态

Microsoft 已确认在 "适用于" 部分中所列的 Microsoft 产品中存在问题。