KB2878968 – ПОПРАВКА: Повреда на неклъстерния индекс може да възникне, когато изпълнявате сложна команда UPDATE заедно с подсказване NOLOCK за таблица в SQL Server

Отнася се за
SQL Server 2008 Service Pack 3 SQL Server 2008 Enterprise SQL Server 2008 Developer SQL Server 2008 Standard SQL Server 2008 R2 Datacenter SQL Server 2008 R2 Developer SQL Server 2008 R2 Enterprise SQL Server 2008 R2 Standard SQL Server 2008 R2 Web SQL Server 2008 R2 Workgroup SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard SQL Server 2012 Web SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use)

Симптоми

Когато изпълнявате сложна команда UPDATE заедно с подсказване NOLOCK за таблица в Microsoft SQL Server 2008, SQL Server 2012, SQL Server 2008 R2 или SQL Server 2014, може да възникне повреда на неклъстерен индекс. Освен това следното съобщение за грешка може да бъде регистрирано в регистрационния файл за грешки на SQL Server:

Забележка

<Дата><Час> # Грешка: 8646, Степен на сериозност: 21, Щат: 1.
<Date><Time> spid # Unable to find index entry in index ID 3, of table 2102402659, in database '<DatabaseName>'. Посоченият индекс е повреден или има проблем с текущия план за актуализация. Изпълнете DBCC CHECKDB или DBCC CHECKTABLE. Ако проблемът продължава, се свържете с поддръжката на продукта.
<Date><Time> spid # Using 'dbghelp.dll' version '4.0.5'
<Date><, Time> spid # **Dump thread - spid = 0, EC = 0x0000000BD70624C0
<Date><, Time> spid # ***Stack Dump being sent to Y:\MSSQL\MSSQL10.MSSQLSERVER\MSSQL\LOG\SQLDump0003.txt
<Date><, Time> spid # * *******************************************************************************
<Дата><и час> spid # *
<Date><Time> spid # * BEGIN STACK DUMP:
<Дата><и час> spid # * <Дата><и час> spid#
<Дата><и час> spid # *
<Date><Time> spid # * CPerIndexMetaQS::ErrorAbort - Повреда на индекса
<Дата><и час> spid # *

Забележка: Можете да приложите NOLOCK съвет към таблиците източници в команда. Не можете обаче да приложите подсказване на NOLOCK към целеви таблици в команда.

Причина

Този проблем възниква, защото подсказването за NOLOCK е причина заявката да чете неправилно стойностите в таблицата, когато заявката чете едни и същи стойности няколко пъти.

Решение

Проблемът е коригиран за първи път в следващата кумулативна актуализация на SQL Server.

Сборна актуализация 1 за SQL Server 2014 г. /bg-bg/help/2931693

Сборна актуализация 11 за SQL Server 2012 г. /en-us/help/2908007

Сборна актуализация 7 за SQL Server 2012 SP1 /en-us/help/2894115

Сборна актуализация 13 за SQL Server 2008 SP3 /en-us/help/2880350

Сборна актуализация 9 за SQL Server 2008 R2 SP2 /en-us/help/2887606

За кумулативните актуализации за SQL Server

Всяка нова кумулативна актуализация за SQL Server съдържа всички актуални поправки и корекции на защитата, които са били включени в предишната кумулативна актуализация. Прегледайте последните кумулативни актуализации за SQL Server:

      

Състояние

Microsoft потвърждава, че това е проблем в продуктите на Microsoft, които са изброени в раздела „Важи за“.