KB2950189 - 修复:在 SQL Server 中具有 DML 触发器的表上执行更新查询时发生访问冲突

应用对象
SQL Server 2008 R2 Service Pack 2 SQL Server 2008 R2 Developer SQL Server 2008 R2 Enterprise SQL Server 2008 R2 Standard 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 R2、SQL Server 2012 或 SQL Server 2014 中具有 DML 触发器,并且在该触发器中,您将插入/删除的表与其他表联接。 当您对此表执行 DML 语句时,触发器编译期间可能会发生访问冲突,您会收到以下错误:

注意

当前命令上发生严重错误。 如果有结果,应丢弃。

此外,以下错误记录在 SQL Server 错误日志中:

注意

<日期><时间> spid# ***堆栈转储正在发送到 <FilePath>\SQLDumpxxx.txt
<Date><Time> spid# SqlDumpExceptionHandler: Process # generated fatal exception c0000005 EXCEPTION_ACCESS_VIOLATION. SQL Server 正在终止此进程。
<日期><时间> spid# * *******************************************************************************
<日期></时间> spid# *
<Date><Time> spid# * BEGIN STACK DUMP:
<日期></时间> spid# * <日期></时间> spid#
<日期></时间> spid# *
<日期></时间> spid# *
<日期><时间> spid# * 异常地址 = 00000000009E4F2A 模块 (sqlservr+00000000002D4F2A)
<日期><时间> spid# * 异常代码 = c0000005 EXCEPTION_ACCESS_VIOLATION
<日期><时间> spid# * 写入地址 00000000000000000
<日期><时间> spid# * 输入缓冲区 510 字节 -
<日期><时间> spid# * SQL_query_code

解决方法

此问题已首先在 SQL Server 的以下累积更新中修复。

SQL Server 2012 SP2 累积更新 1 /en-us/help/2976982

SQL Server 2014 累积更新 2 /en-us/help/2967546

SQL Server 2012 SP1 累积更新 10 /en-us/help/2954099

SQL Server 2008 R2 SP2 累积更新 12 /en-us/help/2938478

关于 SQL Server 的累积更新

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

      

解决方法

要解决此问题,请不要直接在查询中使用插入/删除的表,而是将其缓存在临时表中并在查询中使用临时表。

状态

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