症状
假设您有一个表在 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 的最新累积更新:
- SQL Server 2012 SP2 的最新累计更新
- SQL Server 2014 的最新累计更新
- SQL Server 2012 SP1 的最新累计更新
- SQL Server 2008 R2 SP2 的最新累计更新
解决方法
要解决此问题,请不要直接在查询中使用插入/删除的表,而是将其缓存在临时表中并在查询中使用临时表。
状态
Microsoft 已确认在 "适用于" 部分中所列的 Microsoft 产品中存在问题。