Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Dump 2005  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Чёта я плохо думаю под вечер:
Версия
PRINT @@Version
Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)
Nov 24 2008 13:01:59
Copyright (c) 1988-2005 Microsoft Corporation
Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)

CREATE PROCEDURE Load.spTest AS BEGIN	-- EXEC dbo.spTest
	DECLARE	 @ID		SmallInt
		,@Message	NVarChar(max)

	DECLARE	@Schema	TABLE (
		 [ID]		SmallInt IDENTITY PRIMARY KEY
		,[Action]	NVarChar(max)
	)INSERT	@Schema
	VALUES	(Default)

	DECLARE	crTest	CURSOR SCROLL_LOCKS FOR
	SELECT	 ID
		,[Action]
	FROM	@Schema
	FOR UPDATE OF [Action]

	OPEN	crTest
	FETCH	NEXT
	FROM	crTest
	INTO	 @ID
		,@Message

	BEGIN TRY
		UPDATE	@Schema
		SET	[Action] = 'Testing'
		WHERE	CURRENT OF crTest

		RAISERROR('Test',18,1)
	END TRY BEGIN CATCH
		SET @Message = Error_Message()

		UPDATE	@Schema
		SET	@Message	= [Action] = IsNull([Action] + ': ','') + IsNull(@Message,'')
		WHERE	CURRENT OF crTest
	END CATCH
	DEALLOCATE crTest

	SELECT	@Message

	SELECT	*
	FROM	@Schema
	WHERE	ID = @ID
END
GO
Result 1
EXEC dbo.spTest
(1 row(s) affected)

(1 row(s) affected)

(1 row(s) affected)

(1 row(s) affected)

(1 row(s) affected)

(No column name)
Test

IDAction
1Testing: Test

Result 2
EXEC dbo.spTest

(1 row(s) affected)

(1 row(s) affected)
Location: tmpilb.cpp:2608
Expression: fFalse
SPID: 68
Process ID: 1668
Description: Attempt to access expired blob handle (2)
Msg 3624, Level 20, State 1, Procedure spTest, Line 32
Ошибка проверки системного подтверждения. Дополнительные сведения содержатся в журнале ошибок SQL Server. Обычно ошибка подтверждения вызвана ошибкой программного обеспечения или повреждением данных. Для проверки повреждения базы данных попробуйте запустить команду DBCC CHECKDB. Если во время установки вы согласились на отправку дампов в корпорацию Майкрософт, будет отправлен небольшой дамп. Обновление может быть доступно в последнем пакете обновления Майкрософт или в исправлении QFE службы поддержки.
Msg 0, Level 20, State 0, Line 0
При выполнении текущей команды возникла серьезная ошибка.. При наличии результатов они должны быть аннулированы.
Т.е. падает в dump.
WTF?
10 июн 09, 18:18    [7287313]     Ответить | Цитировать Сообщить модератору
 Re: Dump 2005  [new]
Mayh
Guest
CREATE PROCEDURE Load.spTest

EXEC dbo.spTest

возможно тут ошибка?
10 июн 09, 18:29    [7287346]     Ответить | Цитировать Сообщить модератору
 Re: Dump 2005  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Mayh
CREATE PROCEDURE Load.spTest

EXEC dbo.spTest

возможно тут ошибка?
Нет, приводил паралельно к простой схеме, чтоб код проще был. Просто copy-past не сделал в конце.

Правльно так:
CREATE PROCEDURE [dbo].[spTest] AS BEGIN ...
10 июн 09, 18:39    [7287396]     Ответить | Цитировать Сообщить модератору
 Re: Dump 2005  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
С VarChar(max) также валится, а вот с VarChar(8000) нет.
Синтаксис поддерживается и для 2008 -го. Оговорок в BOL-е не нашёл.
10 июн 09, 18:45    [7287420]     Ответить | Цитировать Сообщить модератору
 Re: Dump 2005  [new]
Mayh
Guest
Mnior
С VarChar(max) также валится, а вот с VarChar(8000) нет.
Синтаксис поддерживается и для 2008 -го. Оговорок в BOL-е не нашёл.


Пробовали ребутать сервер/машину сервера?

Возможно попросту перегрелось железо, на дворе лето.
10 июн 09, 18:53    [7287448]     Ответить | Цитировать Сообщить модератору
 Re: Dump 2005  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Вот другой сервер:

Microsoft SQL Server 2005 - 9.00.3159.00 (Intel X86) 
Mar 23 2007 16:15:11
Copyright (c) 1988-2005 Microsoft Corporation
Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)

Также вылетает со второго запуска, что логично. :)
У кого накатаны последние кумулативы, проверте пжалуста.
10 июн 09, 18:58    [7287464]     Ответить | Цитировать Сообщить модератору
 Re: Dump 2005  [new]
Mayh
Guest
Microsoft SQL Server 2005 - 9.00.3042.00 (Intel X86)   Feb  9 2007 22:47:07   Copyright (c) 1988-2005 Microsoft Corporation  Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2) 

аналогичная картина
10 июн 09, 19:03    [7287474]     Ответить | Цитировать Сообщить модератору
 Re: Dump 2005  [new]
Mayh
Guest
видимо, происходит утечка памяти из-за двойного присвоения @Message


	END TRY BEGIN CATCH
		SET @Message = Error_Message()

		UPDATE	@Schema
		SET	@Message = [Action] = IsNull([Action] + ': ','') + IsNull(Error_Message(),'')
		WHERE	CURRENT OF crTest
	END CATCH



такой код работает, но @Message всё равно не присваивается новое значение.
10 июн 09, 19:19    [7287511]     Ответить | Цитировать Сообщить модератору
 Re: Dump 2005  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Microsoft SQL Server 2008 (SP1) - 10.0.2520.0 (X64) 
Feb 14 2009 00:52:11
Copyright (c) 1988-2008 Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.0 <X64> (Build 6001: Service Pack 1)

Аналогично.
10 июн 09, 19:22    [7287520]     Ответить | Цитировать Сообщить модератору
 Re: Dump 2005  [new]
Crimean
Member

Откуда:
Сообщений: 13148
я п LOCAL дописал к определению курсора, CLOSE дописал перед DEALLOCATE, курсор сделал READ_ONLY, менял значение по ID - все равно он ПК и в CURRENT OF смысла нету
10 июн 09, 20:45    [7287731]     Ответить | Цитировать Сообщить модератору
 Re: Dump 2005  [new]
SkyWalker
Member

Откуда:
Сообщений: 320
Присоедините сюда dump file пожалуйста (.mdmp)
11 июн 09, 06:24    [7288213]     Ответить | Цитировать Сообщить модератору
 Re: Dump 2005  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Crimean
я п LOCAL дописал к определению курсора
Ну это никак не влияет на проблему, да и на задачу.
Crimean
CLOSE дописал перед DEALLOCATE
Зачем?
Crimean
курсор сделал READ_ONLY, менял значение по ID, все равно он ПК и в CURRENT OF смысла нету
CURRENT OF смысл есть, во всяком случае идеолонически это 1. быстрее 2. декларативней/понятней.
READ_ONLY не причём, точнее причём то что делается UPDATE именно через CURRENT OF (курсор), а не поиском по ключу. Списибо, для сужения проблемы поможет ... MS-у. :)
Ну а проблема обходится просто и многими способами.
Конечно не мне судить, но кажется что и проблема плёвая и решается легко.
SkyWalker
Присоедините сюда dump file пожалуйста (.mdmp)
Ага. Как я понял обращаться по таким делам к тебе. Запостить не могу, ограничение на адын килобайт.
11 июн 09, 12:04    [7289402]     Ответить | Цитировать Сообщить модератору
 Re: Dump 2005  [new]
Crimean
Member

Откуда:
Сообщений: 13148
я просто некоторые вещи не использую после того, как нарывался на проблемы
зная MS - они почти никогда не исправляют в том ключе, в котором нужно разработчику, а приводят в соответствие (и то не всегда) со своим пониманием вопроса
в итоге если я раз влетел - обхожу и больше к этим граблям не возвращаюсь
11 июн 09, 12:55    [7289818]     Ответить | Цитировать Сообщить модератору
 Re: Dump 2005  [new]
SkyWalker
Member

Откуда:
Сообщений: 320
Пришли по Email - tcp_43 at hotmail.com
11 июн 09, 19:06    [7292170]     Ответить | Цитировать Сообщить модератору
 Re: Dump 2005  [new]
SkyWalker
Member

Откуда:
Сообщений: 320
автор
зная MS - они почти никогда не исправляют в том ключе, в котором нужно разработчику, а приводят в соответствие (и то не всегда) со своим пониманием вопроса


Как представитель MSFT скажу, что ето не совсем так.
Решение принимается основываясь на следуюших факторах:

- Бизнес обоснование
- Наличие разумного обходного пути (workaround :) )
- Невозможность использования workaround основанное на п.1 или других признаках
- Сложность fix включая regression риск
- Сроки

Согласен что workaround не всегда является приемлемым для разработчика,
но с другой стороны иногда проше изменить код приложения чем SQL Server.

В любом случае при наличии официальното кейса и наличии bug Вы либо получите
workaround и обьяснение почему fix невозможен либо fix.

Я сознательно сделал ударение на наличии bug, потому что не всегда
конкретное поведение продукта обьясняется bug'ом.

Если у Вас есть конкретный кейс, дайте мне знать, я постараюсь с Вами связаться.
11 июн 09, 19:30    [7292230]     Ответить | Цитировать Сообщить модератору
 Re: Dump 2005  [new]
Crimean
Member

Откуда:
Сообщений: 13148
поигрался. "корень зла" в комбинации varchar(max) + вот это:

UPDATE	@Schema
SET	@Message	= [Action] = IsNull([Action] + ': ','') + IsNull(@Message,'')
WHERE	CURRENT OF crTest

если оставить только "приличное" вот так:

UPDATE	@Schema
SET	[Action] = IsNull([Action] + ': ','') + IsNull(@Message,'')
WHERE	CURRENT OF crTest

то все становится ок. я вообще, если честно, не очень понял смысла этой конструкции
+ мои рекомендации - таки поставить LOCAL + CLOSE - вылет будет "мягче"
11 июн 09, 19:31    [7292236]     Ответить | Цитировать Сообщить модератору
 Re: Dump 2005  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Crimean
не очень понял смысла этой конструкции
+ мои рекомендации - таки поставить LOCAL + CLOSE
А чё непонятного?
LOCAL, его можно и по умолчанию для базы ставить. А CLOSE не понял, чем DEALLOCATE плох? Что-то не учитываю? А CLOSE для повторного открытия.
11 июн 09, 20:14    [7292329]     Ответить | Цитировать Сообщить модератору
 Re: Dump 2005  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
SkyWalker, отослал.
Странно, но за это время можно было и самому сгенерить дамп. :-/
11 июн 09, 22:33    [7292622]     Ответить | Цитировать Сообщить модератору
 Re: Dump 2005  [new]
SkyWalker
Member

Откуда:
Сообщений: 320
автор
Странно, но за это время можно было и самому сгенерить дамп. :-/


Прошу прошения, я не сразу заметил что repro не провязано к данным.

Проблема заключается в просроченном указателе на blob content в cache.

Довольно простой workaround - recompile option.

Пожалуйста попробуйте:

UPDATE	@Schema
SET	@Message	= [Action] = IsNull([Action] + ': ','') + IsNull(@Message,'')
WHERE	CURRENT OF crTest
[b]option(recompile)[/b]

Проверьте у себя пожалуйста.

Если есть серьезное бизнесс обоснование и абсолютно небозможно обойтись
данным workaround, откройте официальный кейс, в противном случае
я зафайлю bug для следуюших релизов.

P.S. В принципе Вы можете сами файлить баги на http://connect.microsoft.com/
12 июн 09, 01:05    [7292980]     Ответить | Цитировать Сообщить модератору
 Re: Dump 2005  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
SkyWalker
Проблема заключается в просроченном указателе на blob content в cache.
Довольно простой workaround - recompile option.
Пожалуйста попробуйте: option(recompile)
Что-то не очень похоже, хотя в дамп уже не валится, но переменная по прежнему не равна колонке.
CREATE PROCEDURE spTest AS BEGIN
	DECLARE	 @ID	SmallInt
		,@Data	NVarChar(max)
	SELECT	 @Data	= 'Y'

	DECLARE	@Table	TABLE (
		 ID	SmallInt IDENTITY PRIMARY KEY
		,Data	NVarChar(max)
	)INSERT	@Table
	VALUES	('X')

	SELECT	*,@Data	FROM	@Table

	DECLARE	crTest	CURSOR FOR
	SELECT	 ID
	FROM	@Table
	FOR UPDATE OF Data

	OPEN	crTest
	FETCH	NEXT
	FROM	crTest
	INTO	 @ID

	UPDATE @Table SET @Data = Data = '(' + Data + ',' + @Data + ')'	WHERE CURRENT OF crTest OPTION(Recompile)
	UPDATE @Table SET @Data = Data = '(' + Data + ',' + @Data + ')'	WHERE CURRENT OF crTest OPTION(Recompile)
	UPDATE @Table SET @Data = Data = '(' + Data + ',' + @Data + ')'	WHERE CURRENT OF crTest OPTION(Recompile)
	UPDATE @Table SET @Data = Data = '(' + Data + ',' + @Data + ')'	WHERE CURRENT OF crTest OPTION(Recompile)

	DEALLOCATE crTest

	SELECT	*,@Data	FROM	@Table
END
GO
EXEC spTest
GO
Т.е. проблема именно в самом изменении переменных. Странно, что механизм update-а в курсоре на столько отличается от обычного update-а по условию.
Надо дальше разбираться.

SkyWalker
Если есть серьезное бизнесс обоснование и абсолютно небозможно обойтись
данным workaround, откройте официальный кейс, в противном случае
я зафайлю bug для следуюших релизов.
Проблема легко решается. Но ждём фикса в следующем сервис паке.

В итоге, CURRENT OF зло, как и CURSOR в общем. Тормозной, а ещё и глючный. :)
Если встетил CURRENT OF, значит есть большие проблемы. Может и хорошо, что глючит - "А ненада юзать курсоры и таблы без ключей" , но то что падает в дамп - неприятно.
12 июн 09, 06:26    [7293198]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить