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

Откуда: Екб
Сообщений: 1218
Доброго времени суток!
Столкнулся вот с такой задачей:
В триггере на After update таблицы выполняются проверки, при не прохождении проверки формируется текст сообщения и выбрасывается
EXEC sp_exception @msg1
. Теперь хотелось бы одну из проверок логировать. Проблема в том, что при возникновении exception все изменения откатываются.
Кроме линковки сервера к себе самому, и выполнения вставки в лог через OPENROWSET есть варианты залогировать в табличку сообщения из триггера, при том что он генерит exception? Т.е. по сути надо не дать выполнить нежелательное изменение, залогировать это, выкинуть ошибку клиенту, при том, что сам клиент изменять нельзя.
24 мар 16, 09:33    [18971733]     Ответить | Цитировать Сообщить модератору
 Re: логирование ошибок в триггере  [new]
Glory
Member

Откуда:
Сообщений: 104751
denis_viktorovich
Т.е. по сути надо не дать выполнить нежелательное изменение, залогировать это, выкинуть ошибку клиенту, при том, что сам клиент изменять нельзя.

Если вы не знали, то триггер всегда выполняется в транзакции. А транзакцию невозможнго отменить частично.
Поэтому вам до логирования нужно что-то сделать с текущей транзакцией. А потом уже что-то логировать.
24 мар 16, 09:45    [18971780]     Ответить | Цитировать Сообщить модератору
 Re: логирование ошибок в триггере  [new]
denis_viktorovich
Member

Откуда: Екб
Сообщений: 1218
Glory
Если вы не знали, то триггер всегда выполняется в транзакции. А транзакцию невозможнго отменить частично.
Поэтому вам до логирования нужно что-то сделать с текущей транзакцией. А потом уже что-то логировать.

Знаю, в нормальной ситуации я бы выполнил проверку, откатил или закоммитил транзакцию, а затем залогировал бы, что надо. Но эту часть клиента поменять нельзя, а она просто шлет UPDATE и если получает ошибку, то отображает ее. Получается, чтобы приложение ругнулось на действие пользователя надо генерить Exception. И влезть я могу только в триггер...
24 мар 16, 09:54    [18971816]     Ответить | Цитировать Сообщить модератору
 Re: логирование ошибок в триггере  [new]
Glory
Member

Откуда:
Сообщений: 104751
denis_viktorovich
Знаю, в нормальной ситуации я бы выполнил проверку, откатил или закоммитил транзакцию, а затем залогировал бы, что надо. Но эту часть клиента поменять нельзя, а она просто шлет UPDATE и если получает ошибку, то отображает ее. Получается, чтобы приложение ругнулось на действие пользователя надо генерить Exception. И влезть я могу только в триггер...

А вы в триггере не умеете "я бы выполнил проверку, откатил или закоммитил транзакцию, а затем залогировал бы, что надо" ?
24 мар 16, 09:58    [18971829]     Ответить | Цитировать Сообщить модератору
 Re: логирование ошибок в триггере  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8350
Поищите по форуму, если требуется, можно использовать CREATE EVENT NOTIFICATION.
24 мар 16, 11:26    [18972134]     Ответить | Цитировать Сообщить модератору
 Re: логирование ошибок в триггере  [new]
denis_viktorovich
Member

Откуда: Екб
Сообщений: 1218
Glory,
Хм, вроде работает. Т.е. вкратце сделал вот так:

if LEN(@message)>0 
begin
	rollback tran
	begin tran
	 insert into dbo.MyLog(msg1) values(@message)
	commit tran

        EXEC sp_exception @message 

end	
24 мар 16, 11:46    [18972281]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить