KB3138930 – КОРЕКЦИЯ: Непозволен достъп до памет, когато изпълнявате съхранена процедура, която използва курсор на променлива на таблица в SQL Server

Отнася се за
SQL Server 2012 Service Pack 3 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 2012 или SQL Server 2014. Освен това съхранената процедура актуализира таблицата, като използва командата WHERE CURRENT OF заедно с курсора.

Например вашата съхранена процедура може да изглежда така:

CREATE PROCEDURE dbo.usp_TestSP AS 

BEGIN 

DECLARE @TableVar TABLE (SomeInt INT NULL) 
INSERT @TableVar VALUES (NULL) 

DECLARE @curInt INT, @newInt INT 
SET @newInt = 1 

DECLARE ccc CURSOR LOCAL FOR 
SELECT SomeInt FROM @TableVar WHERE SomeInt IS NULL 

OPEN ccc 

FETCH NEXT FROM ccc INTO @curInt 
UPDATE @TableVar SET SomeInt = @newInt 
WHERE CURRENT OF ccc
CLOSE ccc 

SELECT * FROM @TableVar 
END 

Когато изпълнявате съхранена процедура с помощта на sp_refreshsqlmodule системно съхранена процедура, може да възникне непозволен достъп до памет и може да получавате съобщения за грешка, подобни на следното:

Забележка

Съобщение 596, ниво 21, състояние 1Не може да се продължи изпълнението, защото сесията е в състояние на прекратяване. Съобщение 0, ниво 20, състояние 0Възникна сериозна грешка при текущата команда. Резултатите, ако има такива, трябва да бъдат отхвърлени.

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

Забележка

дата час.730 spid51 SqlDumpExceptionHandler: Процес 51 генерира фатално изключение c0000005 EXCEPTION_ACCESS_VIOLATION. SQL Server прекратява този процес.
date time.730 spid51 * *******************************************************************************
date time.730 spid51 *
date time.730 spid51 * НАЧАЛО НА БУКА НА ПАМЕТТА:
date time.730 spid51 * date time spid 51
date time.730 spid51 *
date time.730 spid51 *
date time.730 spid51 * Exception Address = 00007FFC270236D5 Module(sqllang+0000000005036D5)
date time.730 spid51 * Код на изключение = c0000005 EXCEPTION_ACCESS_VIOLATION
date time.730 spid51 * Възникна нарушение на достъпа адрес за четене 0000006F00620074
date time.730 spid51 * Входен буфер 136 байта -
date time.730 spid51 * EXECUTE sp_refreshsqlmodule N'[dbo]. [usp_TestSP]'
date time.730 spid51 *
date time.730 spid51 *

      

Решение

Кумулативна информация за актуализацията

Този проблем е коригиран в следните актуализации:

          

Препоръка: Инсталирайте най-новата кумулативна актуализация за SQL Server

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

      

Състояние

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

Справки

Научете повече относно терминологията, която Microsoft използва за описване на актуализациите на софтуера.