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

имеется таблица и два триггера. Один из триггеров выполняет некоторую проверку, может возвратить raiserror. Второй триггер просто выполняет какие-то действия.
Упрощенно можно представить так:

if object_id( 'dbo.TestTriggerError' ) is not null
  drop table dbo.TestTriggerError 
  
create table dbo.TestTriggerError ( i int )
go

create trigger tr_1 on dbo.TestTriggerError for insert
as
  -- ...
  raiserror('error!', 16, 1)
  return
  -- ...
go

create trigger tr_2 on dbo.TestTriggerError for insert
as
  -- ...
  print 'ok'
  -- ...
go

insert into dbo.TestTriggerError ( i ) select 1
select @@error


Код должен поддерживаться в т.ч. и в sql 2000, поэтому проверка ошибок только через @@error.
Приведенный выше код возвращает 0, потому что второй триггер выполняется после первого и затирает установленный @@error.

Вопрос - можно ли здесь корректно обработать ошибку, не сливая два триггера в один?
Создание триггеров в другом порядке помогает, но насколько это надежно?
7 авг 13, 07:56    [14673419]     Ответить | Цитировать Сообщить модератору
 Re: Два триггера и @@error  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
gueat_20130807, в начале тригера проверяйте ошибку и сохраняйте ее в переменной, в конце, если она была не 0, генерите ошибку по-новой
7 авг 13, 08:07    [14673431]     Ответить | Цитировать Сообщить модератору
 Re: Два триггера и @@error  [new]
gueat_20130807
Guest
HandKot
в начале тригера проверяйте ошибку и сохраняйте ее в переменной, в конце, если она была не 0, генерите ошибку по-новой

Спасибо, работает.
7 авг 13, 08:13    [14673438]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить