Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Триггер и транзакции.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Транзакция или коммитится целиком, или откатывается. Даже если у лога скорость записи 1 байт в минуту.
1 июн 11, 15:41    [10746484]     Ответить | Цитировать Сообщить модератору
 Re: Триггер и транзакции.  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18328
Mnior
Deff
Так что от ресета нет спасения. Еще раз в этом убедился.
Врёте.
Где-то у вас код затесался без транзакций.
Если бы мой триггер был с ошибкой, такая ситуация вылазила бы чаще.

Однако вылазит крайне редко, и каждый раз связана с ребутом.

CREATE TRIGGER tgTst1 ON deffTest1
FOR INSERT, UPDATE
AS
set nocount on
/*Вот тут блок проверок, но все идут в виде */
IF /*проверка=плохо*/
   BEGIN
  	rollback tran
  	raiserror('Все плохо', 16,16)
  	return --Не забываю.
   END
 
INSERT INTO deffTest2  --Вот тут еще триггера и констрейны. Может придти rollback или ошибка от констрейна, форейна.
SELECT ID from inserted --Как правило все откатывается. Целостность остается. Проверяется часто.
GO
Если очень хотите могу привести полный код триггера.
1 июн 11, 15:43    [10746500]     Ответить | Цитировать Сообщить модератору
 Re: Триггер и транзакции.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Deff
На двух базах - разный результат. Обе написано что 9ые.
Ну так выяснили разницу в параметрах. А то заинтриговали, что где-то 3-ка не появляется.
1 июн 11, 15:45    [10746528]     Ответить | Цитировать Сообщить модератору
 Re: Триггер и транзакции.  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18328
Гавриленко Сергей Алексеевич
Транзакция или коммитится целиком, или откатывается. Даже если у лога скорость записи 1 байт в минуту.
Я знаю постулаты, которые в книжке написаны. А еще так же знаю мир далек от иделала.
1 июн 11, 15:45    [10746535]     Ответить | Цитировать Сообщить модератору
 Re: Триггер и транзакции.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Deff
Гавриленко Сергей Алексеевич
Транзакция или коммитится целиком, или откатывается. Даже если у лога скорость записи 1 байт в минуту.
Я знаю постулаты, которые в книжке написаны. А еще так же знаю мир далек от иделала.
Да-да-да, может и земля-то и не круглая, хоть про это в книжках и написано.
1 июн 11, 15:47    [10746555]     Ответить | Цитировать Сообщить модератору
 Re: Триггер и транзакции.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Deff
Если бы мой триггер был с ошибкой, такая ситуация вылазила бы чаще.
Однако вылазит крайне редко, и каждый раз связана с ребутом.
Нифига.
Чё это ему глючить то, если сервак не падает? А так падает и код без транзакции обрывается. Всё логично.

Deff
Если очень хотите могу привести полный код триггера.
Давайте.
1 июн 11, 15:49    [10746570]     Ответить | Цитировать Сообщить модератору
 Re: Триггер и транзакции.  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18328
Mnior
Deff
На двух базах - разный результат. Обе написано что 9ые.
Ну так выяснили разницу в параметрах. А то заинтриговали, что где-то 3-ка не появляется.
Выяснили. Но как раз на той, на которой произошел сбой - все в порядке(set xact_abort on по умолчанию)
Я, конечно, везде проставлю на всякий случай. Но в данном случае дело не в этом.
1 июн 11, 15:51    [10746596]     Ответить | Цитировать Сообщить модератору
 Re: Триггер и транзакции.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Deff
Mnior
Ну так выяснили разницу в параметрах. А то заинтриговали, что где-то 3-ка не появляется.
Выяснили.
Что-то не доганяю. Так в чём разница? У меня везде 3-ка выходит.
Вы скажите как добиться чтоб не выходила.

Deff
(set xact_abort on по умолчанию)
Вы что на весь сервер ставите?
Всё равно на ваш пример не должно влиять это-же локальный параметр.
1 июн 11, 16:05    [10746720]     Ответить | Цитировать Сообщить модератору
 Re: Триггер и транзакции.  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18328
Mnior
Deff
Если бы мой триггер был с ошибкой, такая ситуация вылазила бы чаще.
Однако вылазит крайне редко, и каждый раз связана с ребутом.
Нифига.
Чё это ему глючить то, если сервак не падает? А так падает и код без транзакции обрывается. Всё логично.

Deff
Если очень хотите могу привести полный код триггера.
Давайте.
Потому что часто ошибки вылазят на констрейн. Очень часто. Давно бы не база была, а каша.

CREATE TRIGGER tgRegistryD19 ON DocDetails1019
FOR INSERT, UPDATE, DELETE
AS
set nocount on

IF ( update(GoodsCount) or update(GoodsID))  
	and exists(select * from deleted d where d.TradeTranStage in (1) )
begin
RollBack tran
Raiserror('Поля: (GoodsCount, GoodsID) не могут быть изменены на данной стадии, так как участвуют в регистре (GoodsLog)', 16, 16)
return
end;

IF ( update(NDS_Rate) or update(summWithNDS))  
	and exists(select * from DocHeaders1019 HF
	inner join DocDetails1019 DF On HF.ID = DF.DOcID and HF.InfoCenter = DF.InfoCenter
	inner join Inserted I on I.ID = DF.ID and I.DocID = DF.DocID and I.InfoCenter = DF.InfoCenter
	where HF.AStage in (11,12,13))
	
begin
RollBack tran
Raiserror('Поля: (NDS_Rate, summWithNDS) не могут быть изменены на данной стадии, так как участвуют в регистре (MainLog)', 16, 16)
return
end;

IF ( update(NDS_Rate) or update(summWithNDS))  
	and exists(select * from DocHeaders1019 HF
	inner join DocDetails1019 DF On HF.ID = DF.DOcID and HF.InfoCenter = DF.InfoCenter
	inner join Inserted I on I.ID = DF.ID and I.DocID = DF.DocID and I.InfoCenter = DF.InfoCenter
	where HF.AStage in (11,12,13))
	
begin
RollBack tran
Raiserror('Поля: (NDS_Rate, summWithNDS) не могут быть изменены на данной стадии, так как участвуют в регистре (MainLog_ANDS)', 16, 16)
return
end;

IF ( update(GoodsID) or update(ID) or update(NDS_Rate) or update(summWithNDS))  
	and exists(select * from DocHeaders1019 HF
	inner join DocDetails1019 DF On HF.ID = DF.DOcID and HF.InfoCenter = DF.InfoCenter
	inner join Inserted I on I.ID = DF.ID and I.DocID = DF.DocID and I.InfoCenter = DF.InfoCenter
	where HF.AStage in (11,12,13))
	
begin
RollBack tran
Raiserror('Поля: (GoodsID, ID, NDS_Rate, summWithNDS) не могут быть изменены на данной стадии, так как участвуют в регистре (MainLog_ANomenclature)', 16, 16)
return
end;

/*CheckBewforeW Begin*/

IF isnull(dbo.getconst('VersionType'),'') in ('Local', 'Single')--IFThen
IF exists(
select * from DocHeaders1019 HF
	inner join DocDetails1019 DF On HF.ID = DF.DocID and HF.InfoCenter = DF.InfoCenter
	inner join Inserted I on I.ID = DF.ID and I.DocID = DF.DocID and I.InfoCenter = DF.InfoCenter
	left  join Deleted D on D.ID = DF.ID and D.DocID = DF.DocID and D.InfoCenter = DF.InfoCenter
	where I.TradeTranStage in (1) and (D.TradeTranStage not in (1) or D.TradeTranStage is null)
	and IsNull(DF.NDS_RATE,-1) not in (select number from dbo.fGetNumbersFromConst('AvailableNDS'))
	) BEGIN
  	rollback tran
  	raiserror('Не верная ставка НДС', 16,16)
  	return
  END
  
IF isnull(dbo.getconst('VersionType'),'') in ('Local', 'Single')--IFThen
IF exists(
select * from DocHeaders1019 HF
	inner join DocDetails1019 DF On HF.ID = DF.DocID and HF.InfoCenter = DF.InfoCenter
	inner join Inserted I on I.ID = DF.ID and I.DocID = DF.DocID and I.InfoCenter = DF.InfoCenter
	left  join Deleted D on D.ID = DF.ID and D.DocID = DF.DocID and D.InfoCenter = DF.InfoCenter
	where I.TradeTranStage in (1) and (D.TradeTranStage not in (1) or D.TradeTranStage is null)
	and exists (select * from objectReg1 s where s.ID = HF.OurSubObjectID and s.AccountType = 6819  and IsNull(DF.NDS_RATE,0) = 0)
	) BEGIN
  	rollback tran
  	raiserror('На ОСНО не может быть нулевой НДС', 16,16)
  	return
  END
  
/*CheckBewforeW End*/

If Update(TradeTranStage) or not exists(select * from Inserted)
begin

delete from reg
from DocHeaders1019 HF 
	inner join Deleted D on HF.ID = D.DocID and HF.InfoCenter = D.InfoCenter
	left  join Inserted I on I.ID = D.ID and I.DocID = D.DocID and I.InfoCenter = D.InfoCenter
	inner join GoodsLog reg on reg.DocID = HF.ID and reg.InfoCenter = HF.InfoCenter and reg.DocTypes = 19  and reg.RowID = D.ID
where (I.TradeTranStage not in (1) or I.TradeTranStage is null) and D.TradeTranStage in (1) 

Insert into GoodsLog(DocTypes, InfoCenter, DocID, RowID, handmade, DTime, GoodsID, OwnerID, GoodsCount, GoodsRemain, SubObjectID)
select  19, HF.InfoCenter, HF.ID, DF.ID, 0, HF.DocDate, DF.GoodsID, HF.OwnerID, -DF.GoodsCount, -DF.GoodsCount, HF.OurSubObjectID
from DocHeaders1019 HF 
	inner join DocDetails1019 DF on HF.ID = DF.DocID and HF.InfoCenter = DF.InfoCenter
		inner join Inserted I on I.ID = DF.ID and I.DocID = DF.DocID and I.InfoCenter = DF.InfoCenter 
	left  join Deleted D on D.ID = DF.ID and D.DocID = DF.DocID and D.InfoCenter = DF.InfoCenter
where I.TradeTranStage in (1) and (D.TradeTranStage not in (1) or D.TradeTranStage is null)
		

return
end
GO

UPDATE dbo.DocDetails1019 SET TradeTranStage=1 WHERE ID = 12345--Триггер был вызван этой операцией.
GO
1 июн 11, 16:08    [10746772]     Ответить | Цитировать Сообщить модератору
 Re: Триггер и транзакции.  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18328
Mnior
Deff
пропущено...
Выяснили.
Что-то не доганяю. Так в чём разница? У меня везде 3-ка выходит.
Вы скажите как добиться чтоб не выходила.

Админ настраивате базы. Сказал что надо еще какие параметры. Не вникал. Главное что работает как мне надо. Я завтра уточню, если хотите.
Mnior
Deff
(set xact_abort on по умолчанию)
Вы что на весь сервер ставите?
Всё равно на ваш пример не должно влиять это-же локальный параметр.

Set xact_abort on в триггере всегда переходит на этот режим. Даже если перед запуском поставить Set xact_abort off.
1 июн 11, 16:13    [10746828]     Ответить | Цитировать Сообщить модератору
 Re: Триггер и транзакции.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Deff
Mnior
Всё равно на ваш пример не должно влиять это-же ЛОКАЛЬНЫЙ параметр.
Set xact_abort on в триггере всегда переходит на этот режим. Даже если перед запуском поставить Set xact_abort off.
Потеряли нить разговора?
В примере же явно написано SET!
Кароче вы не знаете что там да как.

Deff
--Триггер был вызван этой операцией.
Нарушение целостности данных в чём проявлялась?
1 июн 11, 17:24    [10747609]     Ответить | Цитировать Сообщить модератору
 Re: Триггер и транзакции.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Откуда вы взяли что операция при падении была именно такой:
UPDATE dbo.DocDetails1019 SET TradeTranStage=1 WHERE ID = 12345--Триггер был вызван этой операцией.
Откуда вы взяли что за этим UPDATE нет кода нивелирующий побочный "эффект"?

Код не читабелен, много дублирования и чувствителен к побочным действиям. Аля NOT IN (NULL)
1 июн 11, 17:34    [10747684]     Ответить | Цитировать Сообщить модератору
 Re: Триггер и транзакции.  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18328
Код сгенерирован. Ничего там сложного нет. Проверки. Затем вставка или удаление. К тому же я в начале привел структуру триггера. Полный код только по вашей просьбе.

Суть в том, что когда в таблице DocDetails1019 поле TradeTranStage = 1 должна существовать запись таблице GoodsLog.

Есть куча аудитов.
Была всего одна команда
UPDATE dbo.DocDetails1019 SET TradeTranStage=1 WHERE ID = 12345
1 июн 11, 17:55    [10747904]     Ответить | Цитировать Сообщить модератору
 Re: Триггер и транзакции.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Deff
Суть в том, что когда в таблице DocDetails1019 поле TradeTranStage = 1 должна существовать запись таблице GoodsLog.
Это почему же? Там стоят JOIN с 100500 ненужными условиями, откуда это видно что select что-то там вернул? Даже нет проверки @@RowCount. Может у вас вообще нет FK. А при этом, к примеру, ваш скуль вываливается ровно когда удалялось из dbo.DocHeaders или изменилось поле InfoCenter. Или поди хуже, работал в режиме UnCommited или ReadPast.
Или может создалась таблица GoodsLog со схемой пользователя и строка попала туда (вы же схему не пишите).

Deff
Есть куча аудитов.
И что, вы хотите что мы поверили вам на слово? Какие аудиты настроены? Как?
Deff
Была всего одна команда
С чего вы взяли? Там могла быть ещё туча команд не попавших в ваш аудит.
Триггер мог быть выключен. Вы в аудите видите вызовы команд триггера? Нет? Это что за аудит?

Deff, я не помню что кто-то говорил что транзакция работает наполовину. Как падает скуль видел ни одну сотню раз. Но нарушение логической целостности данных никогда. Нарушение базы, выламывание - это да (или сбой железа носителя или проблемы в старых типах баз с BLOB полями). Но логической никогда. Даже при сбоящих процах и памяти. Я могу поверить что это когда-то имело место, но если появится хотя бы один зарегистрированный случай, был бы поднят офигитительный хай, и фикс вышел бы сразу же.

Ваш триггер совершенно ни о чём не говорит, разве что этот быдлокод содержит кучу мелких ошибок.
Банально, в нём никогда не вставляются строчки, а за этой командой UPDATE идёт сразу же команда INSERT dbo.GoodsLog. Вот она и не выполнилась. А ещё может TradeTranStage имел значение 1.

Из этой огромной кучи ЕСЛИ можно сказать, что-то вы точно не выяснили. И не надо даже намекать что где-то у других ошибка. С вероятностью 99.(9)% что у вас, а не у 100500 пользователей скуля.

Из того что у вас там непонятно что мутится. Можно сделать вывод что что-то вы недопонимаете или скрываете. Какие-то там настройки XACT_ABORT никак не влияют на этот триггер. Совсем. Так что жду ответ на мой вопрос (про значение 3 на вашем примере).
-------------------------------------------------------------------------------------------------------------------------
Давайте так. Вы не говорите что сервер глючит, но продолжаете выяснять окружение на время сбоя.
Вы кстати выяснили причину падений? Дампы смотрели?
Как настроен логинг баз? Какое железо (с контролем целостности)? И ещё тысячи вопросов. И главная - версия сервера.
2 июн 11, 01:31    [10749745]     Ответить | Цитировать Сообщить модератору
 Re: Триггер и транзакции.  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18328
Mnior,

Каких мелких ошибок? Какие не нужные условия? Что за безосновательные предположения?
А ну и конечно, все указаные вами ошибки всплыли именно при падении сервера.

Если не нашли грубой ошибки, то наверное не стоит бред всякий предполагать.

Мне даже лень по пунктам отвечать. В кратце уровень SERIALIZABLE. Ключи, FK все настроено правильно. Документ был создан и проведен джобой.



Mnior
Какие-то там настройки XACT_ABORT никак не влияют на этот триггер. Совсем. Так что жду ответ на мой вопрос (про значение 3 на вашем примере).
Что это значит?
Триггер ведет себя так, как будто в нем стоит XACT_ABORT ON.
Вы же сами написали:
SET XACT_ABORT OFF is not allowed in triggers when compatibility level is 90 or above.

Может он при падении ведет себя иначе? Не знаю.

Так же я написал что на tempDB
SET XACT_ABORT OFF is not allowed in triggers when compatibility level is 90 or above.

данное утверждение не работет. Так же у меня происходить еще на одной не рабочей базе.
Все на одном сервере. Почему так происходит, мне не очень интересно. Главное что на моей боевой базе все работает как надо.

Mnior
Вы не говорите что сервер глючит, но продолжаете выяснять окружение на время сбоя
Я так то и завел топик, потому что не верю, что так происходит. Хотя я не понимаю, откуда у вас такая святая вера в безгрешность SQL сервера.
Mnior
Вы кстати выяснили причину падений? Дампы смотрели?
Нажатие кнопки ресет.
Mnior
Какое железо (с контролем целостности)?
Железо не серверное.
Mnior
И главная - версия сервера.
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)
2 июн 11, 09:46    [10750285]     Ответить | Цитировать Сообщить модератору
 Re: Триггер и транзакции.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Так, не буду отвечать на всё сразу, вас и так колбасит.
----------------------------------------------------------------------
Повторяю из выше сказанного ибо не врубились.
SET XACT_ABORT OFF is not allowed in triggers when compatibility level is 90 or above.
Написано в bug-е. Это не мои слова. Они не верны. Забудьте (вам же итак пофигу, знания же вам не нужны).
Это к тому что работает наполовину так/наполовину эдак (счётчик транзакций ломает поведение). Если хотите чтоб всё-таки разжевал - спрашивайте.
----------------------------------------------------------------------
Deff
CREATE TRIGGER tgTst1 ON t1
FOR INSERT, UPDATE
AS
set nocount ON
SET XACT_ABORT off
INSERT INTO t2 VALUES (1);
INSERT INTO t2 VALUES (2); -- Foreign key error.
INSERT INTO t2 VALUES (3);
GO
На двух базах - разный результат. Обе написано что 9ые.
Вы должны ответить за слова. Если разный результат этого кода (при явном указании SET), то хамба. System Failue. Мы обязаны разобраться почему, ибо этого не должно быть при любом раскладе.
Я и никто на кроме вас не может повторить - результат везде всегда один и тотже.

Если вы нагнали, то доверять вашим словам придётся ещё меньше.
Если вы не описали что-то важное по теме, то огромный минус вам.
----------------------------------------------------------------------
Deff
Хотя я не понимаю, откуда у вас такая святая вера в безгрешность SQL сервера.
Вы неправильно интерпретируете мои слова. Не надо ничего обобщать.
Вы просто не можете оценить масштабов использования и тем самым вероятность вашего "случая".
----------------------------------------------------------------------
Deff
Каких мелких ошибок?
Небезопасный синтаксис (BEGIN / END). Использование NOT IN. Связывание таблиц не только по ключам. Дублирование кода.
Deff
SERIALIZABLE
Круто.
----------------------------------------------------------------------
Deff
Что за безосновательные предположения?
Предположения не могут быть безосновательными. Вы должны доказать, а не мы должны верить.
Deff
А ну и конечно, все указаные вами ошибки всплыли именно при падении сервера.
Я указал некоторые ошибки, которые могут проявляются только при падении.
Deff
Если не нашли грубой ошибки, то наверное не стоит бред всякий предполагать.
Вы тормозите, вероятность что ошибка в триггере меньше всего (но есть). Вероятнее что она за пределами намного больше.
Ради этой малой вероятности я просил. Но это ничего не доказывает и не оправдывает. Хотя если вы этой элементарной вещи не понимаете, то зачем тут нянькаться с вами.

Ещё пример/предположение. У вас настроен линк сервера сам на себя с отключенной транзакционностью. Вы делаете логирование через него используя синонимы. (Если такое возможно)

Deff
Документ был создан и проведен джобой.
Это что за бред? Вы можете сказать как идёт аудит или нет? Нет? Вы не знаете как? Вы не разбираетесь в этом?

Deff
Нажатие кнопки ресет.
Боже. Тонко тролите.
Ага, нажал на ресет не на боевом сервере, и некий аудит в вакууме всё разжевал и выдал - ошибка в ядре скуля при выполнении этого триггера. Давайте вы не будете тут заливать.

Или вы доказываете что ошибка в ядре или мы считаем что вы гоните. Ok?!
2 июн 11, 13:02    [10751964]     Ответить | Цитировать Сообщить модератору
 Re: Триггер и транзакции.  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18328
Начнем с SET XACT_ABORT OFF в триггере.
Действительно у меня на разных базах на одном сервере - разное поведение.

Что мне сделать что бы доказать это? Скриншоты?
Каким запросом получить настройки бд, что бы выложить сюда?
2 июн 11, 13:46    [10752388]     Ответить | Цитировать Сообщить модератору
 Re: Триггер и транзакции.  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18328
Для начала вот скриншот из студии.

Есть отличия в настройках:
Arithmetic abort enable
quoted identifierers enable

Игра параметрами "QUOTED_IDENTIFIER" и "ARITHABORT" результат не изменила, что и следовало ожидать. На что еще посмотреть?

К сообщению приложен файл. Размер - 2Kb
2 июн 11, 14:01    [10752535]     Ответить | Цитировать Сообщить модератору
 Re: Триггер и транзакции.  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18328
Всё. Я ошибся.
Работает во всех базах в триггер SET XACT_ABORT OFF одинаково!
Это вопрос можно закрывать.


Но по умолчанию в триггере стоит SET XACT_ABORT ON.
Так что это не решение моей основной проблемы.
2 июн 11, 14:11    [10752656]     Ответить | Цитировать Сообщить модератору
 Re: Триггер и транзакции.  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18328
Давйте дальше.
Mnior
Небезопасный синтаксис (BEGIN / END). Использование NOT IN. Связывание таблиц не только по ключам

Небезопасный синтаксис (BEGIN / END)- Ну это уж вы вообщее... Или может я чего не знаю?

Использование NOT IN - оно там неободимо по логике и оно всегда в виде
(D.TradeTranStage not in (1) or D.TradeTranStage is null)
что как бы обезопасивает, не правда ли?

Связывание таблиц не только по ключам - Представте по ключам.
ALTER TABLE [dbo].[DocDetails1019]  WITH CHECK ADD  CONSTRAINT [FK_DocDetails1019_DocHeaders1019] FOREIGN KEY([DocID], [InfoCenter])
REFERENCES [dbo].[DocHeaders1019] ([ID], [InfoCenter])
2 июн 11, 14:20    [10752766]     Ответить | Цитировать Сообщить модератору
 Re: Триггер и транзакции.  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18328
Дальше.
Я уверен, что триггер доходит до кода(когда это нужно), где происходить вставка в таблицу2(GoodsLog). У меня на этом держится целостность не первый день, не на одном сервере. Идея проста, появилась запись в документе, где поле TradeTranStage=1 - значит есть эквивалент в GoodsLog. Изчезла - изчезнет и в GoodsLog. Все просто, и это работает.


На таблице GoodsLog тоже есть триггеры и констрейны.
Что такого может произойти там, что запись не вставится, а транзакция закомитется?

Set xact_abort on - стоит по умолчанию в триггере, хоть явно и не указан. Если покажете, что если в триггере нету явного указания Set xact_abort on, и он при этом может вести себя по разному - буду премного благодарен.

В моем случае было так. Документ несколько тысяч строк. Проводились по позиционно. По одной строке, т.е.
Update Docdetails1019 set TradeTranStage=1 where ID = @ID
Две соседние записи из середины(понимаю, что это условно) не попали в GoodsLog.
Есть поля timestamp и datechange, по которым я вижу, что все происходило штатно. Есть таблица учета действий пользователя, там тоже ничего интересного. Поэтому для меня не понятно. Не к чему зацепиться, кроме как к тому, что в это же время был жесткий ребут.
2 июн 11, 14:44    [10753057]     Ответить | Цитировать Сообщить модератору
 Re: Триггер и транзакции.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Deff
Есть поля timestamp и datechange, по которым я вижу, что все происходило штатно. Есть таблица учета действий пользователя, там тоже ничего интересного. Поэтому для меня не понятно. Не к чему зацепиться, кроме как к тому, что в это же время был жесткий ребут.
Правильно, баги только ведь майкрософт делает.
2 июн 11, 14:49    [10753105]     Ответить | Цитировать Сообщить модератору
 Re: Триггер и транзакции.  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18328
Гавриленко Сергей Алексеевич
Deff
Есть поля timestamp и datechange, по которым я вижу, что все происходило штатно. Есть таблица учета действий пользователя, там тоже ничего интересного. Поэтому для меня не понятно. Не к чему зацепиться, кроме как к тому, что в это же время был жесткий ребут.
Правильно, баги только ведь майкрософт делает.
Я ведь не создал топик с названием "Баги в майкрософте". Я создал топик, что бы попытаться решить проблему.

Вот думаю сделать в таблице Docdetails1019 форейн кей на GoodsLog, что бы заполнять его в конце триггера. Если поле будет не нуловое, а запись в таблице GoodsLog будет отсутсвовать - это будет явно говорит о нарушении логической целостности базы.
2 июн 11, 15:05    [10753281]     Ответить | Цитировать Сообщить модератору
 Re: Триггер и транзакции.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Deff
Вот думаю сделать в таблице Docdetails1019 форейн кей на GoodsLog, что бы заполнять его в конце триггера. Если поле будет не нуловое, а запись в таблице GoodsLog будет отсутсвовать - это будет явно говорит о нарушении логической целостности базы.
Ваш триггер бесполезен в случае, пока констрент есть и включен. Потому что все проверки на возможность модификации данных будут выполнены до работы триггера.
2 июн 11, 15:08    [10753307]     Ответить | Цитировать Сообщить модератору
 Re: Триггер и транзакции.  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18328
Гавриленко Сергей Алексеевич
Deff
Вот думаю сделать в таблице Docdetails1019 форейн кей на GoodsLog, что бы заполнять его в конце триггера. Если поле будет не нуловое, а запись в таблице GoodsLog будет отсутсвовать - это будет явно говорит о нарушении логической целостности базы.
Ваш триггер бесполезен в случае, пока констрент есть и включен. Потому что все проверки на возможность модификации данных будут выполнены до работы триггера.
Вот так вот можно:
IF OBJECT_ID(N't2', N'U') IS NOT NULL
    DROP TABLE t2;
GO
IF OBJECT_ID(N't1', N'U') IS NOT NULL
    DROP TABLE t1;
GO
CREATE TABLE t1
    (a INT NOT NULL PRIMARY KEY);
CREATE TABLE t2
    (a INT NULL REFERENCES t1(a), ID INT);
GO
INSERT INTO T1 (a) VALUES (1)

SET XACT_ABORT on
BEGIN tran

INSERT INTO T2 (ID)
SELECT 123

UPDATE t2 SET a = 1 WHERE Id = 123
commit TRAN
 
SELECT * FROM t2
2 июн 11, 15:18    [10753441]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить