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

Откуда:
Сообщений: 521
День добрый!
Есть процедура с кодом типа:
BEGIN TRANSACTION

	UPDATE MyTable
	SET MyCol = 'XYZ'
	WHERE ID = 123

COMMIT TRANSACTION


Существует триггер на апдейт таблицы MyTable, который вносит ID измененной строки в таблицу TableAudit.

Переодически процедура падает :(
В профайлере я вижу такую картину:

name starttime endtime RowNumber EventClass TextData
SP:StmtStarting 2014-05-20 15:48:18.270 NULL 4738 44 UPDATE MyTable SET...
SP:StmtStarting 2014-05-20 15:48:18.283 NULL 4756 44 INSERT INTO TableLevelAudit...

Ну и соответственно не вижу что эти процессы заканчиваются, т.е. нет EventClass=55
Зато через пол минуты происходит ролбек транзакции (процедура вызывается приложением, в котором установлен таймаут 30 секунд).
Так вот, в чем вопрос, как на самом деле работает тригер? Если я вижу в трейсе, что была команда "INSERT INTO TableLevelAudit", то апдейт MyTable выполнился и нужно искать почему невозможно сделать инсерт в TableLevelAudit, или триггер срабатывает в любом случае и проблема все-таки может быть в MyTable ?

Спасибо!
20 май 14, 20:37    [16044892]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз разобраться с транзакцией( апдейт с триггером)  [new]
invm
Member

Откуда: Москва
Сообщений: 9838
Добавьте в трассу SP:StmtCompleted и все увидите.
20 май 14, 21:31    [16045089]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз разобраться с транзакцией( апдейт с триггером)  [new]
Glory
Member

Откуда:
Сообщений: 104751
abrashka
Если я вижу в трейсе, что была команда "INSERT INTO TableLevelAudit", то апдейт MyTable выполнился и нужно искать почему невозможно сделать инсерт в TableLevelAudit, или триггер срабатывает в любом случае и проблема все-таки может быть в MyTable ?

Команда "апдейт MyTable" не закончена, пока не закончен триггер.
А триггер не закончен, потому что не закончена команда "инсерт в TableLevelAudit".

abrashka
Ну и соответственно не вижу что эти процессы заканчиваются, т.е. нет EventClass=55

Наверное 45 ?
20 май 14, 22:33    [16045318]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз разобраться с транзакцией( апдейт с триггером)  [new]
abrashka
Member

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

SP:StmtCompleted добавлено, это EventClass 45, сорри, ошибся, написал 55.

Glory,
Так следует, что раз выскочил триггер(SP:StmtStarting 2014-05-20 15:48:18.283 NULL 4756 44 INSERT INTO TableLevelAudit...) через Х секунд после начала выполнения апдейта(SP:StmtStarting 2014-05-20 15:48:18.270 NULL 4738 44 UPDATE MyTable SET), то апдейт MyTable выполнился без проблем и занял грубо говоря Х секунд?
Т.е. чтоб решить данную проблему- нужно разобраться с тем, почему не выполняется действие триггера(INSERT INTO TableLevelAudit)?


Спасибо!
20 май 14, 23:50    [16045581]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз разобраться с транзакцией( апдейт с триггером)  [new]
Glory
Member

Откуда:
Сообщений: 104751
abrashka
Т.е. чтоб решить данную проблему- нужно разобраться с тем, почему не выполняется действие триггера(INSERT INTO TableLevelAudit)?

Оно выполняется.
Просто не укладывается в заданный вами таймаут
20 май 14, 23:52    [16045585]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз разобраться с транзакцией( апдейт с триггером)  [new]
abrashka
Member

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

Это и имелось в виду... на самом деле там простейший инсерт, до таймаута еще 29 секунд, нет видимых причин, чтоб не выполнялся за это время:(

Буду думать почему... Теперь хоть знаю где искать, а то раньше грешил на MyTable, но там никакого криминала не нашел.

Спасибо огромное!
21 май 14, 00:05    [16045613]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз разобраться с транзакцией( апдейт с триггером)  [new]
Glory
Member

Откуда:
Сообщений: 104751
abrashka
. на самом деле там простейший инсерт, до таймаута еще 29 секунд, нет видимых причин, чтоб не выполнялся за это время:(

При блокировке запрос может выполняться бесконечно долго
21 май 14, 00:09    [16045631]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз разобраться с транзакцией( апдейт с триггером)  [new]
abrashka
Member

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

Спасибо, на самом деле другая транзакция блокировала именно TableLevelAudit( Х type).
21 май 14, 15:49    [16049678]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз разобраться с транзакцией( апдейт с триггером)  [new]
кириллk
Member

Откуда:
Сообщений: 1062
Есть такой тригер
ALTER TRIGGER [dbo].[reminder] ON [dbo].[BI_1]
AFTER UPDATE
AS
IF ( UPDATE ([name]) )
BEGIN
Insert into T2
select "Что изменилось"
END;

Можно ли как -то логировать, какие конкретно значения поменялись?
23 окт 14, 10:47    [16746977]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз разобраться с транзакцией( апдейт с триггером)  [new]
Glory
Member

Откуда:
Сообщений: 104751
кириллk
Можно ли как -то логировать, какие конкретно значения поменялись?

UPDATE mytable SET name=name - это конкретно поменялись или неконкретно ?
23 окт 14, 12:41    [16747677]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз разобраться с транзакцией( апдейт с триггером)  [new]
кириллk
Member

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

update [dbo].[BI_1] set
[name] ='test'
where [name] ='test2'


Вообще задача отваливать значение которое изменилось
23 окт 14, 12:49    [16747741]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз разобраться с транзакцией( апдейт с триггером)  [new]
Glory
Member

Откуда:
Сообщений: 104751
кириллk
Вообще задача отваливать значение которое изменилось

Ну так при UPDATE mytable SET name=name - значение для вас изменилось или нет ?
23 окт 14, 12:51    [16747760]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз разобраться с транзакцией( апдейт с триггером)  [new]
кириллk
Member

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

Это тригеру решать, но я понимаю что "изменилось".

Просто изменилось, само на себя
23 окт 14, 13:09    [16747915]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз разобраться с транзакцией( апдейт с триггером)  [new]
Glory
Member

Откуда:
Сообщений: 104751
кириллk
Это тригеру решать, но я понимаю что "изменилось".

Триггеру вообще неинтересно, что произошло с данными. Триггер сработал на команду.
А в чем ваша проблема/сомнения - неясно.
23 окт 14, 13:13    [16747946]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз разобраться с транзакцией( апдейт с триггером)  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
кириллk
Glory,

Это тригеру решать, но я понимаю что "изменилось".

Просто изменилось, само на себя
Вы оживили триггер?
Теперь он решает за Вас?

Читайте про функции UPDATE() и COLUMNS_UPDATED()

Если они не устраивают, то можете считать, что всегда изменяются все поля.
Даже если значения остаются прежними.
23 окт 14, 13:16    [16747981]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз разобраться с транзакцией( апдейт с триггером)  [new]
кириллk
Member

Откуда:
Сообщений: 1062
Glory
кириллk
Это тригеру решать, но я понимаю что "изменилось".

Триггеру вообще неинтересно, что произошло с данными. Триггер сработал на команду.
А в чем ваша проблема/сомнения - неясно.


Спрошу по другому, как мне логировать, что поменял update?

было

Id name
1, a
2, c

стало

Id name
1, b
2, c

Я хочу записать в отдельную таблицу
id
1

Я думал эту логику можно задать в тригере

Поменялся id=1
23 окт 14, 13:25    [16748062]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз разобраться с транзакцией( апдейт с триггером)  [new]
Glory
Member

Откуда:
Сообщений: 104751
кириллk
Я думал эту логику можно задать в тригере

Ну так задайте. Вы думаете, что триггер это за вас сделает что ли ?
23 окт 14, 13:26    [16748077]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз разобраться с транзакцией( апдейт с триггером)  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
кириллk
что поменял update
Какой именно UPDATE?
23 окт 14, 13:30    [16748116]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз разобраться с транзакцией( апдейт с триггером)  [new]
кириллk
Member

Откуда:
Сообщений: 1062
iap
кириллk
что поменял update
Какой именно UPDATE?

ALTER TRIGGER [dbo].[reminder] ON [dbo].[BI_1]
AFTER UPDATE 
AS 
IF ( UPDATE ([name]) )
BEGIN
Insert into T2 
select [name]  as [hist]
where [name]= ----- как сюда передать, то что поменялось?
END;
23 окт 14, 13:49    [16748316]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз разобраться с транзакцией( апдейт с триггером)  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
кириллk
iap
пропущено...
Какой именно UPDATE?

ALTER TRIGGER [dbo].[reminder] ON [dbo].[BI_1]
AFTER UPDATE 
AS 
IF ( UPDATE ([name]) )
BEGIN
Insert into T2 
select [name]  as [hist]
where [name]= ----- как сюда передать, то что поменялось?
END;
JOIN с inserted спасёт!
23 окт 14, 13:51    [16748323]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз разобраться с транзакцией( апдейт с триггером)  [new]
Glory
Member

Откуда:
Сообщений: 104751
кириллk
как сюда передать, то что поменялось?

select * from inserted - вот все, что как-то поменялось
23 окт 14, 13:52    [16748337]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз разобраться с транзакцией( апдейт с триггером)  [new]
кириллk
Member

Откуда:
Сообщений: 1062
Glory
кириллk
как сюда передать, то что поменялось?

select * from inserted - вот все, что как-то поменялось


Вооот! То что нужно! Спасибо!

Скажите пожалуйста, как надо было поставить вопрос, чтобы было сразу понятно?
23 окт 14, 14:03    [16748419]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить