Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Валдай 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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8317 |
Валдай, как внешняя транзакция повлияет, если вы выполняете rollback по ошибке и только после отсылаете письмо. Вероятно. ошибка у Вас возникает или вне блока catch или вы не указали, что между begin try и begin tran существуют команды, генерящие ошибку. Также |
13 янв 15, 16:57 [17112105] Ответить | Цитировать Сообщить модератору |
Валдай Member Откуда: Сообщений: 113 |
Вот вот, это я читал, поэтому и прошу совета, как еще можно послать письмо из-под транзакции которая будет откачена?. С минимально возможными правами. Есть у кого нибудь практика по этому вопросу? |
||||
13 янв 15, 16:58 [17112117] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8317 |
Валдай, выбрасывайте ошибку наверх и там отсылайте письмо, если код имеет такое неконтролируемое поведение. |
13 янв 15, 17:00 [17112135] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Вы спрашиваете, как сделать так, чтобы процедура работала недокументировано ?? |
||
13 янв 15, 17:02 [17112145] Ответить | Цитировать Сообщить модератору |
Валдай Member Откуда: Сообщений: 113 |
Да, некорректно привел пример. В реальной процедуре, сначала делается поверка по @@trancount, потом открывается именованная транзакция, если есть внешняя. Сорру, но в целом вопрос. как послать письмо, если в итоге внешняя транзакция откатывается. Что кроме sp_send_dbmail можно использовать? Из стандартных средств. |
||
13 янв 15, 17:05 [17112178] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
sp_send_dbmail и является стандратным средством |
||
13 янв 15, 17:08 [17112197] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8317 |
Выбрасывайте ошибку наверх (;THROW), как я писал, отсылайте письмо во всех процедурах в обработчике ошибки которые вызывают проблемную процедуру.
Это совершенно лишние действия. |
||
13 янв 15, 17:10 [17112212] Ответить | Цитировать Сообщить модератору |
Валдай Member Откуда: Сообщений: 113 |
Нет нет, вопрос про то, есть ли еще ДРУГИЕ способы отсылки писем, минимальные по правам. Конкретно с этой функцией мне все понятно. |
||||
13 янв 15, 17:16 [17112240] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Чем не устроили стандартные серверные alert-ы ? |
||
13 янв 15, 17:17 [17112246] Ответить | Цитировать Сообщить модератору |
Валдай Member Откуда: Сообщений: 113 |
Да, я местами передаю ее как output параметр, местами делаю re-raiserror, но есть для меня пара тупиков алгоритмических для sp_send_dbmail. Их Glory показал в документации. Что еще можно сделать? |
||
13 янв 15, 17:20 [17112275] Ответить | Цитировать Сообщить модератору |
Валдай Member Откуда: Сообщений: 113 |
А можно попродробнее? Но если правильно произвольную ошибку через алерт не вернешь? |
||||
13 янв 15, 17:30 [17112357] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Что вы называете "произвольной ошибкой" ? |
||
13 янв 15, 17:33 [17112380] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8317 |
Другие - это использование OLE Automation, например CDO. Но это требует прав сисадмина, т.е. пользователи не смогут использовать. |
13 янв 15, 17:35 [17112396] Ответить | Цитировать Сообщить модератору |
mike909 Member Откуда: Сообщений: 662 |
Валдай, Как сделать часть транзакции без откатной? |
13 янв 15, 17:38 [17112414] Ответить | Цитировать Сообщить модератору |
Валдай Member Откуда: Сообщений: 113 |
Ошибка, которая вернется или из-за технической ошибки, или из-за принудительно вызванного raiserror внутри обработки с описанием бизнес ошибки. |
||||
13 янв 15, 17:46 [17112465] Ответить | Цитировать Сообщить модератору |
Валдай Member Откуда: Сообщений: 113 |
Хм. Просвяти. Я могу очень мало влиять на некоторый код. Он то вендора, то параллельных подразделей... |
||||
13 янв 15, 18:11 [17112580] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Все технические ошибки являются системными. И они уже заранее определены.
Вы через отсылку мейлов пытаетесь вести лог ошибок что ли ? |
||||
14 янв 15, 11:01 [17115148] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8317 |
Лишняя проверка потому что можно открывать транзакцию без проверок. От этого ни холодно, ни жарко, а лишнего кода меньше. Только каждому begin tran должен соответствовать commit. Т.е. транзакция пишется как обычно, неважно "вложена" они или нет. Если по каким-то причинам требуется откат переносить в вызвавшую процедуру, то в начале текущей процедуры необходимо запомнить значение счетчика транзакций и включить его в обработку ошибки. |
||||
14 янв 15, 11:33 [17115332] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |