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

Откуда:
Сообщений: 61
Здравствуйте! вопрос.
Есть процедура

CREATE PROCEDURE [dbo].[Proc]
AS
BEGIN
  BEGIN TRAN
    UPDATE SomeTable SET Field='Value'
    IF @@ROWCOUNT > 0
  COMMIT TRAN 
  ELSE ROLLBACK TRAN
END
GO

Есть таблица

CREATE TABLE SomeTable (id int not null Primary key identity (1,1), Field varchar(10))

и триггер на таблице SomeTable
CREATE TRIGGER [dbo].[Trig] ON [dbo].[SomeTable] 
FOR UPDATE
AS 
IF EXISTS (SELECT * FROM INSERTED WHERE Field='Value')
BEGIN
  RAISERROR('Restricted Value', 16, 1)
  ROLLBACK TRAN
END

В принципе тут все правильно написано. Как только мы пытаемся изменить значение какого-либо поля Field в таблице SomeTable на значение Value транзакция откатывается и выдается предупреждение.

Помогите мне пожалуйста понять последовательность действий SQL сервера. Я это вижу так.
В процедуре начинаем транзакцию, далее выполняем UPDATE, далее после выполнения UPDATE срабатывает триггер, который видит что, значение поля пытаются изменить на Value после чего выполняет откат транзакции и выдает предупреждение. Затем возвращаемся в процедуру и проверяем значение переменной @@ROWCOUNT. Она Соответственно=0. Далее опять происходит откат транзакции, что должно по идее вызвать ошибку так как транзакция была уже откачена в триггере. Однако никаких сообщения от SQL по поводу того того, что я откатил откаченную транзакцию я не получил.
В чем я ошибаюсь?
14 июл 09, 17:19    [7415114]     Ответить | Цитировать Сообщить модератору
 Re: триггер и транзакция  [new]
Козьма Прутков
Member

Откуда: Москва
Сообщений: 186
в том, что таблица пуста, и inserted пуст, соответственно, IF EXISTS не выполняется.
Вставьте строку, а потом уже вызывайте свою процедуру - будет ожидаемый результат.

------------
Чем сложнее решение задачи, тем больше вероятность, что оно неправильное
14 июл 09, 17:50    [7415345]     Ответить | Цитировать Сообщить модератору
 Re: триггер и транзакция  [new]
totoshka-83
Member

Откуда:
Сообщений: 61
Козьма Прутков,

В таблице есть записи. :) Тут дело в чем то другом
14 июл 09, 17:59    [7415424]     Ответить | Цитировать Сообщить модератору
 Re: триггер и транзакция  [new]
Glory
Member

Откуда:
Сообщений: 104760
totoshka-83
Я это вижу так.
В процедуре начинаем транзакцию, далее выполняем UPDATE, далее после выполнения UPDATE срабатывает триггер, который видит что, значение поля пытаются изменить на Value после чего выполняет откат транзакции и выдает предупреждение. Затем возвращаемся в процедуру и проверяем значение переменной @@ROWCOUNT. Она Соответственно=0. Далее опять происходит откат транзакции, что должно по идее вызвать ошибку так как транзакция была уже откачена в триггере. Однако никаких сообщения от SQL по поводу того того, что я откатил откаченную транзакцию я не получил.
В чем я ошибаюсь?

Возьмите Profiler или дебаггер и узнайте, совпадают ли ваши предположения с действительностью

И не мешало бы перед COMMIT или ROLLBACK проверять наличие транзакции

Сообщение было отредактировано: 14 июл 09, 18:13
14 июл 09, 18:12    [7415512]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить