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

Откуда:
Сообщений: 1134
Дело в том что в триггере необходимо проверить как происходит изменение в рамках общей транзакции или в автокомите и писать это в лог? Как это выяснить? (@@trancount в этом случае естественно не поможет...)
7 окт 04, 15:33    [1016333]     Ответить | Цитировать Сообщить модератору
 Re: Как в триггере определить что изменение происходит в рамках "общей" транзакции?  [new]
МуМу
Member

Откуда:
Сообщений: 1134
Т.е. нужно понять проходит ли изменение в рамках begin tran и т.п. или же в рамках обычного автокомита. т.е. когда операторы идут один за другим без открытия транзакции.
7 окт 04, 15:38    [1016352]     Ответить | Цитировать Сообщить модератору
 Re: Как в триггере определить что изменение происходит в рамках "общей" транзакции?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
Триггер всегда выполняется в транзакции.
7 окт 04, 15:38    [1016353]     Ответить | Цитировать Сообщить модератору
 Re: Как в триггере определить что изменение происходит в рамках "общей" транзакции?  [new]
МуМу
Member

Откуда:
Сообщений: 1134
Мда... с instead триггерами такая же фишка. Смысл в том что при определенном стечении обстоятельств транзакция в приложении не открывается. Хотелось бы понять это навернякаи поймать так сказать за руку:) Думаю как бы это сделать...
7 окт 04, 15:43    [1016382]     Ответить | Цитировать Сообщить модератору
 Re: Как в триггере определить что изменение происходит в рамках "общей" транзакции?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
МуМу
Мда... с instead триггерами такая же фишка. Смысл в том что при определенном стечении обстоятельств транзакция в приложении не открывается. Хотелось бы понять это навернякаи поймать так сказать за руку:) Думаю как бы это сделать...

Транзакции всю жизнь на сервере были ....
P.S. Посмотрите @@trancount, может поможет
7 окт 04, 15:45    [1016393]     Ответить | Цитировать Сообщить модератору
 Re: Как в триггере определить что изменение происходит в рамках "общей" транзакции?  [new]
Alexey Kudinov
Member

Откуда:
Сообщений: 13597
select @@TRANCOUNT
- посчитать сколько должно быть открытых транзакций и сколько их есть
7 окт 04, 15:46    [1016396]     Ответить | Цитировать Сообщить модератору
 Re: Как в триггере определить что изменение происходит в рамках "общей" транзакции?  [new]
МуМу
Member

Откуда:
Сообщений: 1134
Это первое что я сделал.


CREATE TABLE [t1] (
[a] [int] NOT NULL
) ON [PRIMARY]
GO

CREATE TRIGGER [tr] ON [dbo].[t1]
INSTEAD OF INSERT
AS
insert into [log] values('t1',@@trancount)
GO

CREATE TABLE [log] (
[tablename] [char] (100) COLLATE Cyrillic_General_CI_AS NOT NULL ,
[trancount] [int] NOT NULL
) ON [PRIMARY]
GO


что в первом варианте
begin tran
insert into t1 values(15)
select @@trancount
commit tran

что во втором
insert into t1 values(15)

в таблице log значение trancount=2
7 окт 04, 15:52    [1016420]     Ответить | Цитировать Сообщить модератору
 Re: Как в триггере определить что изменение происходит в рамках "общей" транзакции?  [new]
МуМу
Member

Откуда:
Сообщений: 1134
Если бы иметь какой нибудь уникальный идентификатор транзакции ну или счетчик в пределах сессии. Тогда бы можно было бы его сравнивать в разных таблицах изменения в которых должны проходить в рамках одной транзакции.
7 окт 04, 15:55    [1016434]     Ответить | Цитировать Сообщить модератору
 Re: Как в триггере определить что изменение происходит в рамках "общей" транзакции?  [new]
МуМу
Member

Откуда:
Сообщений: 1134
Самое интересное что если поставить
begin tran
begin tran
insert into t1 values(15)
commit tran
commit tran
то в log
попадают значения не 2 а 3. Но мне то нужно отловить ситуацию когда транзакций не больше открыто а наоборот меньше т.е. когда в явном виде она не открывается:(
7 окт 04, 16:03    [1016478]     Ответить | Цитировать Сообщить модератору
 Re: Как в триггере определить что изменение происходит в рамках "общей" транзакции?  [new]
МуМу
Member

Откуда:
Сообщений: 1134
Ведь по идее SQL сервер знает в каком режиме он обрабатывает данные. Как бы у него эту информацию позаимствовать? может как нибудь через DBCC и т.п. ?
7 окт 04, 16:07    [1016507]     Ответить | Цитировать Сообщить модератору
 Re: Как в триггере определить что изменение происходит в рамках "общей" транзакции?  [new]
guest00x
Guest
Немного непонятно что именно удивляет
то, что при insert без begin tran происходит транзакция?
или что в таблице log значение trancount=2 ?
CREATE TRIGGER [tr] ON [dbo].[t1] 
INSTEAD OF INSERT
AS
declare @tcount int
set @tcount=@@trancount
insert into [log] values('t1',@tcount)

>Но мне то нужно отловить ситуацию когда транзакций не больше открыто а наоборот меньше
На форуме уже много раз обсуждали подобные вопросы, можно предложить популярное решение:
while @@trancount>0 commit tran
7 окт 04, 16:12    [1016542]     Ответить | Цитировать Сообщить модератору
 Re: Как в триггере определить что изменение происходит в рамках "общей" транзакции?  [new]
МуМу
Member

Откуда:
Сообщений: 1134
То guest00x

Афигенно! Я же написал для чего мне это нужно... Мне нужно поймать ошибку приложения. Как вы думаете на какой базе , на тестовой? - конечно же нет если бы я мог сэмулировать эту ситуацию то я не задавался бы этим вопросом вообще. Мне это нужно включить на рабочей и я не могу к сожалению закрывать транзакцию где не попадя...
7 окт 04, 16:17    [1016573]     Ответить | Цитировать Сообщить модератору
 Re: Как в триггере определить что изменение происходит в рамках "общей" транзакции?  [new]
guest00x
Guest
>и я не могу к сожалению закрывать транзакцию где не попадя...
Есть только одно место, где закрывается транзакция (и все аля вложенные) - самый внешний коммит, там и ставьте while @@trancount>0 commit tran, ИМХО
7 окт 04, 16:29    [1016647]     Ответить | Цитировать Сообщить модератору
 Re: Как в триггере определить что изменение происходит в рамках "общей" транзакции?  [new]
МуМу
Member

Откуда:
Сообщений: 1134
ммм.. пожалуй не сказал что я не могу менять код программы(клиента):( Точнее могу но это крайне не желательно. И опять таки что мне это даст? Транзакции очень большие и затрагивают довольно много объектов. Так я бы через dinamic SQL сгенерировал траггеров и знал бы на каких таблицах и в какой последовтаельности это происходит. В данном случае анализировать код гораздо сложней, ну и опять повторюсь что модификация кода это самый последний вариант.
7 окт 04, 16:35    [1016683]     Ответить | Цитировать Сообщить модератору
 Re: Как в триггере определить что изменение происходит в рамках "общей" транзакции?  [new]
quest00x
Guest
Ну, можно еще попробовать SQL Profiler, Transactions Event Category.
Особенно если транзакции именованные...?
7 окт 04, 16:52    [1016781]     Ответить | Цитировать Сообщить модератору
 Re: Как в триггере определить что изменение происходит в рамках "общей" транзакции?  [new]
МуМу
Member

Откуда:
Сообщений: 1134
Уже пробывал. Информационный оборот очень большой... Проблема возникает редко но метко. Мало того эта проблема возникает у клиента со всеми вытекающими проблемами. (Транзакции не именнованые). Как вариант в триггере на те таблицы которые всегда должны изменятся в общей транзакции писать в текст что то типа :
--МойМаркер ТаблицаXXXX ДокNNN время пользовательХ
и попутно с Transactions Event Category и TSQL bath(не помню точно как клас называется) с фильтром на %--МойМаркер% так мне удастся минимизировать получаемый файл трейса. Анализируя потом позиции которые не попали во внутрь транзакций я получу необходимую инфу. Но вы сами видете сколько телодвижений что бы получить информацимя которая и так есть у SQL сервера в момент исполнения. Вообщем как запасной вариант я его тоже держу.
7 окт 04, 17:00    [1016824]     Ответить | Цитировать Сообщить модератору
 Re: Как в триггере определить что изменение происходит в рамках "общей" транзакции?  [new]
МуМу
Member

Откуда:
Сообщений: 1134
Итак, подвожу итог. К сожалению внутри триггера нельзя определить внутри какой транзакции происходит изменение. Это очень печально так как для тестирования ошибок открытия,закрытия транзакций это был бы эффективный инструмент.
8 окт 04, 10:05    [1017880]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить