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

Откуда: Казань
Сообщений: 502
В 2005 если выдать ROLLBACK в триггере, то клиент получит ошибку с кодом 3609 и уровнем серъезности 16.
В 2000 - никакой ошибки не было.

Пример :
create table ta (a1 int)
go
create trigger tr_ta_insert on ta for insert
as
if (select a1 from inserted) > 100 begin
  raiserror('неверные данные',10,1)
  rollback
  return
end
GO
insert ta values(101)

Результат в 2005 :
неверные данные
Msg 3609, Level 16, State 1, Line 1
The transaction ended in the trigger. The batch has been aborted.

Результат в 2000 :
неверные данные

Возможны проблемы при переводе приложений с 2000 на 2005.
У меня такая проблема произошла с ISA 2004 при журналировании трафика из-за наличия в триггере на таблицу Webproxylog оператора ROLLBACK TRAN.

См. статью из BOL :
Rollbacks and Commits in Stored Procedures and Triggers
Откат и фиксация транзакций в хранимых процедурах и триггерах
18 авг 06, 12:19    [3022277]     Ответить | Цитировать Сообщить модератору
 Re: Изменилось поведение триггеров в 2005 при выполнении ROLLBACK  [new]
Crimean
Member

Откуда:
Сообщений: 13148
select @@version
18 авг 06, 12:44    [3022537]     Ответить | Цитировать Сообщить модератору
 Re: Изменилось поведение триггеров в 2005 при выполнении ROLLBACK  [new]
Даутов
Member

Откуда: Казань
Сообщений: 502
Crimean
select @@version

2000 SE + SP3 (8.0.760)
2005 SE + SP1 (9.0.2047)
18 авг 06, 14:02    [3023425]     Ответить | Цитировать Сообщить модератору
 Re: Изменилось поведение триггеров в 2005 при выполнении ROLLBACK  [new]
Glory
Member

Откуда:
Сообщений: 104760
create table ta (a1 int)
go
create trigger tr_ta_insert on ta for insert
as
if (select a1 from inserted) > 100 begin
  raiserror('неверные данные',10,1)
  rollback
  begin transaction
  return
end
GO
insert ta values(101)
18 авг 06, 14:09    [3023500]     Ответить | Цитировать Сообщить модератору
 Re: Изменилось поведение триггеров в 2005 при выполнении ROLLBACK  [new]
Даутов
Member

Откуда: Казань
Сообщений: 502
Glory
create table ta (a1 int)
go
create trigger tr_ta_insert on ta for insert
as
if (select a1 from inserted) > 100 begin
  raiserror('неверные данные',10,1)
  rollback
  begin transaction
  return
end
GO
insert ta values(101)

Это возможное решение из BOL.
Но оно требует управления открытой транзакцией в последующем коде.
И нет совместимости transact-кода между версиями 2000 и 2005.
18 авг 06, 14:37    [3023784]     Ответить | Цитировать Сообщить модератору
 Re: Изменилось поведение триггеров в 2005 при выполнении ROLLBACK  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Ставьте на 2005 совместимость с 80.
18 авг 06, 14:43    [3023849]     Ответить | Цитировать Сообщить модератору
 Re: Изменилось поведение триггеров в 2005 при выполнении ROLLBACK  [new]
Даутов
Member

Откуда: Казань
Сообщений: 502
tpg
Ставьте на 2005 совместимость с 80.

Уровень совместимости БД (80 или 90) на поведение сервера в данном случае не влияет
18 авг 06, 15:00    [3024010]     Ответить | Цитировать Сообщить модератору
 Re: Изменилось поведение триггеров в 2005 при выполнении ROLLBACK  [new]
Crimean
Member

Откуда:
Сообщений: 13148
спасибо за предупреждение, пошел копать...
совместимость - больная тема, однако...
18 авг 06, 15:14    [3024153]     Ответить | Цитировать Сообщить модератору
 Re: Изменилось поведение триггеров в 2005 при выполнении ROLLBACK  [new]
BugsBunny
Member

Откуда: GMT+5=EST
Сообщений: 2414
create table ta (a1 int)
go
create trigger tr_ta_insert on ta for insert
as
if (select a1 from inserted) > 100 begin
  raiserror('неверные данные',10,1)
  rollback
  if serverproperty('ProductVersion') > '9' begin transaction --Изменилось поведение триггеров в 2005 при выполнении ROLLBACK 
  return
end
GO
insert ta values(101)
18 авг 06, 21:55    [3026777]     Ответить | Цитировать Сообщить модератору
 Re: Изменилось поведение триггеров в 2005 при выполнении ROLLBACK  [new]
Crimean
Member

Откуда:
Сообщений: 13148
2 BugsBunny

а это мысль! спасибо!

P.S.хотя нам, как оказалось, сама ситуация не вредна :-)
19 авг 06, 11:17    [3027631]     Ответить | Цитировать Сообщить модератору
 Re: Изменилось поведение триггеров в 2005 при выполнении ROLLBACK  [new]
BugsBunny
Member

Откуда: GMT+5=EST
Сообщений: 2414
Crimean
2 BugsBunny

а это мысль! спасибо!

P.S.хотя нам, как оказалось, сама ситуация не вредна :-)

yeap, it's just a thought - it doesn't solve the problem of "Но оно требует управления открытой транзакцией в последующем коде.". It's just implied that one should start differentiating between versions.
As per your "P.S." I think it means that you have more robust code written...
5 сен 06, 18:01    [3096265]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Изменилось поведение триггеров в 2005 при выполнении ROLLBACK  [new]
Vladlmlr
Guest
Это из-за автокоммита транзакций. Роллбэк не причем, если вы завершили транзакцию в триггере нужно открыть для автокоммита.
Да?
9 окт 13, 10:26    [14943207]     Ответить | Цитировать Сообщить модератору
 Re: Изменилось поведение триггеров в 2005 при выполнении ROLLBACK  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Vladlmlr
Это из-за автокоммита транзакций. Роллбэк не причем, если вы завершили транзакцию в триггере нужно открыть для автокоммита.
Да?


Автокоммит тут не причем. До 2005 версии ROLLBACK в триггере проходил без эксепшена.
9 окт 13, 10:50    [14943338]     Ответить | Цитировать Сообщить модератору
 Re: Изменилось поведение триггеров в 2005 при выполнении ROLLBACK  [new]
Vladlmlr
Guest
После коммита в триггере (и не открытии транзакции) тоже будет ругаться, что транзакция завершена в триггере.

Почему в триггере при трай-кэтч нужно изголяться с транзакциями. Без этого ошибка и автооткат, даже последнего селекта не увидим.

create TRIGGER trTest2 ON Table1 AFTER INSERT AS BEGIN

commit transaction

begin try
declare @i int
select @i = '1/0' -- или просто делим

begin tran -- на случай, если убрать ошибку из теста
end try

begin catch
begin tran

insert into debData (cmt, err, ErrDesc, ErrSrc)
SELECT 'my', ERROR_SEVERITY(), ERROR_MESSAGE(), ERROR_PROCEDURE()
end catch

select 'commit transaction'
END

Трай-кэтч реализован на сэйвах транзакций?
9 окт 13, 11:13    [14943467]     Ответить | Цитировать Сообщить модератору
 Re: Изменилось поведение триггеров в 2005 при выполнении ROLLBACK  [new]
Glory
Member

Откуда:
Сообщений: 104760
Vladlmlr
После коммита в триггере (и не открытии транзакции) тоже будет ругаться, что транзакция завершена в триггере.

Еще раз - в 2000 и в 2005 разное поведение у триггеров для _завершения_транзакции.
Причем тут автокоммит ?
9 окт 13, 11:16    [14943492]     Ответить | Цитировать Сообщить модератору
 Re: Изменилось поведение триггеров в 2005 при выполнении ROLLBACK  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Vladlmlr
Почему в триггере при трай-кэтч нужно изголяться с транзакциями.


Не надо изгаляться. Особенно коммитить транзакцию и начинать новую. try...catch никакого отношения к сейвпоинтам не имеет. Какую задачу Вы пытаетесь решить таким извращенным способом?
9 окт 13, 11:19    [14943518]     Ответить | Цитировать Сообщить модератору
 Re: Изменилось поведение триггеров в 2005 при выполнении ROLLBACK  [new]
Vladlmlr
Guest
Спасибо за ответ. Пришлось извращаться )

Задачу любую:

create TRIGGER trTest2 ON Table1 AFTER INSERT AS BEGIN

begin try
-- ду самсинг
end try

begin catch
-- ду самсинг2
end catch

-- ду самсинг3
END

В качестве теста сгенерил эти пару ошибок и сильно удивлен поведением.
Уровень ошибки 16>10, а как-будто нет трай-кэтча: откат, нет выполнения кода после катча, и ошибка на клиенте.
9 окт 13, 11:39    [14943685]     Ответить | Цитировать Сообщить модератору
 Re: Изменилось поведение триггеров в 2005 при выполнении ROLLBACK  [new]
Vladlmlr
Guest
ЗЫ. Предположение о сайвпонтах возникло, т.к. вынос открытия транзакции из катча не помогал.
Т.е. для теста делал один общий бегинтран сразу после коммита. И опять видел ошибку на клиенте.
9 окт 13, 11:43    [14943721]     Ответить | Цитировать Сообщить модератору
 Re: Изменилось поведение триггеров в 2005 при выполнении ROLLBACK  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
Vladlmlr,

в триггерах xact_abort в on автоматически устанавливается.
set xact_abort off в начало триггера поставьте.
9 окт 13, 12:01    [14943864]     Ответить | Цитировать Сообщить модератору
 Re: Изменилось поведение триггеров в 2005 при выполнении ROLLBACK  [new]
Vladlmlr
Guest
Спасибо. В эту сторону не докапал. XACT_STATE все объясняет.
9 окт 13, 12:18    [14943960]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить