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

Откуда:
Сообщений: 36
Честно говоря, не понимаю, как такое может происходить. Может кто сталкивался?

1. Есть набор таблиц с одинаковой структурой и вьюшка над ними с дополнительным полем "тип" и триггерами на вставку и изменение (вставка в таблицы идет в зависимости от указанного типа).

2. Есть хранимая процедура, которая производит вставку в эту вьюху значения параметров - тип данных и данные. Процедура дергается всегда по три раза - для трех разных типов данных (заказ, инвойс и клиент).

Собственно, проблема - с завидной регулярностью, однако довольно случайным образом, т.е. воспроизвести не получается, виден только результат, в разных таблицах появляется одно и то же сообщение. Профайлер показывает, что процедура на вставку дергалась с корректными сообщениями, прямых апдейтов таблиц/вьюхи не было. Сегодня запустил профайлер с показом инструкций внутри процедуры, но пока поймать не удалось.

Версия: Microsoft SQL Server 2005 - 9.00.4035.00 (X64) Nov 24 2008 16:17:31 Copyright (c) 1988-2005 Microsoft Corporation Standard Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2)
3 авг 09, 13:00    [7490467]     Ответить | Цитировать Сообщить модератору
 Re: Подмена данных в хранимке  [new]
Glory
Member

Откуда:
Сообщений: 104760
Чудес не бывает. Сервер сам ничего не подменяет. Ошибка в логике вашего кода
3 авг 09, 13:06    [7490506]     Ответить | Цитировать Сообщить модератору
 Re: Подмена данных в хранимке  [new]
Ыукупф
Member

Откуда:
Сообщений: 36
Хотелось бы верить, но 99% случаев все работает нормально - пока что максимально зафиксировано два случая в день, обычно без ошибок.

В триггере на вставку повторяется следующий код и больше ничего (с заменой таблицы и типа, разумеется)

	insert into PivotalFiles_Orders (
		[id]
		,[Data]
		,[EntityID]
		,[DateTime]
		,[ImportStatus]
		,[ImportStatusDate]
		,[ImportError]
		,[TS_OrderID]
		,[TS_Product_Id]
		,[TS_Company_ID]
		,[TS_101_Reason]
	)
	output null into ID_Storage(dummy)
	select
		(select ident_current('ID_Storage'))
		,[Data]
		,[EntityID]
		,[DateTime]
		,[ImportStatus]
		,[ImportStatusDate]
		,[ImportError]
		,[TS_OrderID]
		,[TS_Product_Id]
		,[TS_Company_ID]
		,[TS_101_Reason]
	from
		inserted 
	where 1 = 1
		and type = 'Order'		

ID_Storage - просто таблица с полем IDENTITY

Процедура тоже предельно простая

ALTER procedure [dbo].[PivotalFiles_Insert]    
    
@Data text,    
@Type varchar(20),
@EntityID int = 0   
as    
    
if (@Type = 'Supplier' or @Type='Product' or @Type = 'Invoice' or @Type = 'Order' or @Type = 'Customer')    
    
 INSERT INTO [PivotalFiles]( [Data], [Type], [DateTime], EntityID, [ImportStatus])    
    
 VALUES( @Data , @Type, getDate(), @EntityID, 1)  

GO



Уж не знаю, где тут в логике может закрасться ошибка :(
3 авг 09, 13:18    [7490580]     Ответить | Цитировать Сообщить модератору
 Re: Подмена данных в хранимке  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Ыукупф,
пересоздайте VIEW с параметром
WITH VIEW_METADATA
Иногда шибко умный клиент вставляет напрямую в таблицы мимо VIEW, если такой параметр не задавался.
При этом и триггеры VIEW не выполняются.
Это всё документировано в BOL
3 авг 09, 13:41    [7490738]     Ответить | Цитировать Сообщить модератору
 Re: Подмена данных в хранимке  [new]
Ыукупф
Member

Откуда:
Сообщений: 36
iap,

Спасибо, попробую. Однако все равно непонятно - почему одинаковые данные попадают в разные таблицы, если исходно процедура дергалась с разными параметрами. Если б происходило то, что Вы говорите, то как я понимаю, данные бы оказывались в одной таблице...
3 авг 09, 13:47    [7490775]     Ответить | Цитировать Сообщить модератору
 Re: Подмена данных в хранимке  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ыукупф
Однако все равно непонятно - почему одинаковые данные попадают в разные таблицы, если исходно процедура дергалась с разными параметрами. Если б происходило то, что Вы говорите, то как я понимаю, данные бы оказывались в одной таблице...

А почему вы уверены, что неверные данные попадают в таблицы именно через процедуры и триггер ?
Вы ведете аудит, в котором виден источник, который осуществиил insert ?
3 авг 09, 13:51    [7490799]     Ответить | Цитировать Сообщить модератору
 Re: Подмена данных в хранимке  [new]
Ыукупф
Member

Откуда:
Сообщений: 36
Glory,

Даты создания записей совпадают со временем вызовом процедуры в профайлере. Я допускаю, что изменения проходят потом, но как уже сказал, прямых апдейтов не было. Есть еще одна процедура, которая меняет статус и записывает ошибку при наличии, но изменения данных под вопросом там нет. Все процедуры запускаются BizTalk 2004, в профайлере других вызовов не замечено. Слава богу, на живой системе такого не происходит, на тестовой аудит не ведется. Сейчас запустил профайлер с большей детализацией - посмотрю, что происходит (но пока не повторилось). Версии серверов на обоих системах одинаковые.
3 авг 09, 14:08    [7490909]     Ответить | Цитировать Сообщить модератору
 Re: Подмена данных в хранимке  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ыукупф
Glory,

Даты создания записей совпадают со временем вызовом процедуры в профайлере.

Даты создания записи НЕ показывает какой командой и откуда эта запись была создана
3 авг 09, 14:10    [7490925]     Ответить | Цитировать Сообщить модератору
 Re: Подмена данных в хранимке  [new]
Ыукупф
Member

Откуда:
Сообщений: 36
Glory
Ыукупф
Glory,

Даты создания записей совпадают со временем вызовом процедуры в профайлере.

Даты создания записи НЕ показывает какой командой и откуда эта запись была создана


Сложно с Вами не согласиться. Есть только косвенные факты - профайлер показывает, что BizTalk три раза дернул процедуру с разными данными, в трех разных таблицах есть записи с датами создания, совпадающими со временами соотв. событий в профайлере
3 авг 09, 14:28    [7491011]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить