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

Откуда:
Сообщений: 113
Всем добрый день,

Коллеги, подскажите есть способ получить по почте текст ошибки возникшей внутри транзакции если в результате обработки этой ошибки транзакция была откачена?

Т.е. есть процедура P1 внутри которой есть что-то такое:

BEGIN TRY
  BEGIN TRAN
  -- SQL 
  IF @@TRANCOUNT > 0 COMMIT TRAN

END TRY
BEGIN CATCH
  IF @@TRANCOUNT > 0 ROLLBACK TRAN
  SET @RetVal = 1
  SET @ErrorMessage   = ERROR_MESSAGE()
  EXEC msdb..sp_send_dbmail 
    @profile_name          = 'default profile',
    @recipients            = @recipients      ,
    @subject               = @subject         , 
    @importance            = @importance      ,
    @body_format           = 'HTML'           ,
    @body                  = @ErrorMessage    ,

END
---
RETURN @RetVal


обычно она просто вызывается, но иногда она вызывается из внешней процедуры внутри еще одной транзакции.
Внешняя процедура смотрит на то, что возвращает первая процедура и если код возврата не 0 делает откат внешней транзакции.

В итоге письмо в ошибкой не уходит. Т.к. письмо тоже в результате откатывается из очереди.
Как то это можно обойти? использовать что-то другое вместо sp_send_dbmail?

В некоторых местах использовал output параметры для возврата ошибки "наверх", но в некоторых случаях я не могу менять параметры процедур. Для записи в системный лог прав нет.
13 янв 15, 16:36    [17111970]     Ответить | Цитировать Сообщить модератору
 Re: Сообщение по почте из под транзакции  [new]
Glory
Member

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

BOL
When executing sp_send_dbmail without a transaction context, Database Mail starts and commits an implicit transaction. When executing sp_send_dbmail from within an existing transaction, Database Mail relies on the user to either commit or roll back any changes. It does not start an inner transaction.
13 янв 15, 16:47    [17112038]     Ответить | Цитировать Сообщить модератору
 Re: Сообщение по почте из под транзакции  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8317
Валдай, как внешняя транзакция повлияет, если вы выполняете rollback по ошибке и только после отсылаете письмо.
Вероятно. ошибка у Вас возникает или вне блока catch или вы не указали, что между begin try и begin tran существуют команды, генерящие ошибку.

Также
IF @@TRANCOUNT > 0 COMMIT TRAN
13 янв 15, 16:57    [17112105]     Ответить | Цитировать Сообщить модератору
 Re: Сообщение по почте из под транзакции  [new]
Валдай
Member

Откуда:
Сообщений: 113
Glory
Валдай
В итоге письмо в ошибкой не уходит. Т.к. письмо тоже в результате откатывается из очереди.
Как то это можно обойти?

BOL
When executing sp_send_dbmail without a transaction context, Database Mail starts and commits an implicit transaction. When executing sp_send_dbmail from within an existing transaction, Database Mail relies on the user to either commit or roll back any changes. It does not start an inner transaction.


Вот вот, это я читал, поэтому и прошу совета, как еще можно послать письмо из-под транзакции которая будет откачена?. С минимально возможными правами.
Есть у кого нибудь практика по этому вопросу?
13 янв 15, 16:58    [17112117]     Ответить | Цитировать Сообщить модератору
 Re: Сообщение по почте из под транзакции  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8317
Валдай,

выбрасывайте ошибку наверх и там отсылайте письмо, если код имеет такое неконтролируемое поведение.
13 янв 15, 17:00    [17112135]     Ответить | Цитировать Сообщить модератору
 Re: Сообщение по почте из под транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104760
Валдай
Вот вот, это я читал, поэтому и прошу совета, как еще можно послать письмо из-под транзакции которая будет откачена?. С минимально возможными правами.
Есть у кого нибудь практика по этому вопросу?

Вы спрашиваете, как сделать так, чтобы процедура работала недокументировано ??
13 янв 15, 17:02    [17112145]     Ответить | Цитировать Сообщить модератору
 Re: Сообщение по почте из под транзакции  [new]
Валдай
Member

Откуда:
Сообщений: 113
Владислав Колосов
Валдай, как внешняя транзакция повлияет, если вы выполняете rollback по ошибке и только после отсылаете письмо.
Вероятно. ошибка у Вас возникает или вне блока catch или вы не указали, что между begin try и begin tran существуют команды, генерящие ошибку.

Также
IF @@TRANCOUNT > 0 COMMIT TRAN


Да, некорректно привел пример. В реальной процедуре, сначала делается поверка по @@trancount, потом открывается именованная транзакция, если есть внешняя. Сорру, но в целом вопрос. как послать письмо, если в итоге внешняя транзакция откатывается. Что кроме sp_send_dbmail можно использовать? Из стандартных средств.
13 янв 15, 17:05    [17112178]     Ответить | Цитировать Сообщить модератору
 Re: Сообщение по почте из под транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104760
Валдай
Что кроме sp_send_dbmail можно использовать? Из стандартных средств.

sp_send_dbmail и является стандратным средством
13 янв 15, 17:08    [17112197]     Ответить | Цитировать Сообщить модератору
 Re: Сообщение по почте из под транзакции  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8317
Выбрасывайте ошибку наверх (;THROW), как я писал, отсылайте письмо во всех процедурах в обработчике ошибки которые вызывают проблемную процедуру.

автор
В реальной процедуре, сначала делается поверка по @@trancount, потом открывается именованная транзакция, если есть внешняя

Это совершенно лишние действия.
13 янв 15, 17:10    [17112212]     Ответить | Цитировать Сообщить модератору
 Re: Сообщение по почте из под транзакции  [new]
Валдай
Member

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

Вы спрашиваете, как сделать так, чтобы процедура работала недокументировано ??


Нет нет, вопрос про то, есть ли еще ДРУГИЕ способы отсылки писем, минимальные по правам. Конкретно с этой функцией мне все понятно.
13 янв 15, 17:16    [17112240]     Ответить | Цитировать Сообщить модератору
 Re: Сообщение по почте из под транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104760
Валдай
Нет нет, вопрос про то, есть ли еще ДРУГИЕ способы отсылки писем, минимальные по правам. Конкретно с этой функцией мне все понятно.

Чем не устроили стандартные серверные alert-ы ?
13 янв 15, 17:17    [17112246]     Ответить | Цитировать Сообщить модератору
 Re: Сообщение по почте из под транзакции  [new]
Валдай
Member

Откуда:
Сообщений: 113
Владислав Колосов
Валдай,

выбрасывайте ошибку наверх и там отсылайте письмо, если код имеет такое неконтролируемое поведение.


Да, я местами передаю ее как output параметр, местами делаю re-raiserror, но есть для меня пара тупиков алгоритмических для sp_send_dbmail. Их Glory показал в документации. Что еще можно сделать?
13 янв 15, 17:20    [17112275]     Ответить | Цитировать Сообщить модератору
 Re: Сообщение по почте из под транзакции  [new]
Валдай
Member

Откуда:
Сообщений: 113
Glory
Валдай
Нет нет, вопрос про то, есть ли еще ДРУГИЕ способы отсылки писем, минимальные по правам. Конкретно с этой функцией мне все понятно.

Чем не устроили стандартные серверные alert-ы ?


А можно попродробнее? Но если правильно произвольную ошибку через алерт не вернешь?
13 янв 15, 17:30    [17112357]     Ответить | Цитировать Сообщить модератору
 Re: Сообщение по почте из под транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104760
Валдай
Но если правильно произвольную ошибку через алерт не вернешь?

Что вы называете "произвольной ошибкой" ?
13 янв 15, 17:33    [17112380]     Ответить | Цитировать Сообщить модератору
 Re: Сообщение по почте из под транзакции  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8317
Другие - это использование OLE Automation, например CDO. Но это требует прав сисадмина, т.е. пользователи не смогут использовать.
13 янв 15, 17:35    [17112396]     Ответить | Цитировать Сообщить модератору
 Re: Сообщение по почте из под транзакции  [new]
mike909
Member

Откуда:
Сообщений: 662
Валдай,

Как сделать часть транзакции без откатной?
13 янв 15, 17:38    [17112414]     Ответить | Цитировать Сообщить модератору
 Re: Сообщение по почте из под транзакции  [new]
Валдай
Member

Откуда:
Сообщений: 113
Glory
Валдай
Но если правильно произвольную ошибку через алерт не вернешь?

Что вы называете "произвольной ошибкой" ?


Ошибка, которая вернется или из-за технической ошибки, или из-за принудительно вызванного raiserror внутри обработки с описанием бизнес ошибки.
13 янв 15, 17:46    [17112465]     Ответить | Цитировать Сообщить модератору
 Re: Сообщение по почте из под транзакции  [new]
Валдай
Member

Откуда:
Сообщений: 113
Владислав Колосов
Выбрасывайте ошибку наверх (;THROW), как я писал, отсылайте письмо во всех процедурах в обработчике ошибки которые вызывают проблемную процедуру.

автор
В реальной процедуре, сначала делается поверка по @@trancount, потом открывается именованная транзакция, если есть внешняя

Это совершенно лишние действия.


Хм. Просвяти. Я могу очень мало влиять на некоторый код. Он то вендора, то параллельных подразделей...
13 янв 15, 18:11    [17112580]     Ответить | Цитировать Сообщить модератору
 Re: Сообщение по почте из под транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104760
Валдай
Ошибка, которая вернется или из-за технической ошибки,

Все технические ошибки являются системными. И они уже заранее определены.

Валдай
или из-за принудительно вызванного raiserror внутри обработки с описанием бизнес ошибки.

Вы через отсылку мейлов пытаетесь вести лог ошибок что ли ?
14 янв 15, 11:01    [17115148]     Ответить | Цитировать Сообщить модератору
 Re: Сообщение по почте из под транзакции  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8317
Валдай
Владислав Колосов
Выбрасывайте ошибку наверх (;THROW), как я писал, отсылайте письмо во всех процедурах в обработчике ошибки которые вызывают проблемную процедуру.

пропущено...

Это совершенно лишние действия.


Хм. Просвяти. Я могу очень мало влиять на некоторый код. Он то вендора, то параллельных подразделей...

Лишняя проверка потому что можно открывать транзакцию без проверок. От этого ни холодно, ни жарко, а лишнего кода меньше.
Только каждому begin tran должен соответствовать commit. Т.е. транзакция пишется как обычно, неважно "вложена" они или нет.
Если по каким-то причинам требуется откат переносить в вызвавшую процедуру, то в начале текущей процедуры необходимо запомнить значение счетчика транзакций и включить его в обработку ошибки.
14 янв 15, 11:33    [17115332]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить