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

Откуда: ни: возьмись.
Сообщений: 1601
Вот кусок хранимой процедуры:
BEGIN TRAN

DELETE FROM Table1 WHERE Col11=@ID
DELETE FROM Table2 WHERE Col21=@ID --Привязан триггер на DELETE. Удаляет из Table3.

COMMIT TRAN

Если при выполнении второго DELETE возникает ошибка, она не транслируется в клиент, хотя при вызове ХП из SQL Server Management Studio, она отображается:

(0 row(s) affected)
Msg 547, Level 16, State 0, Procedure MyProc, Line 11
The DELETE statement conflicted with the REFERENCE constraint "FK_Table3_ConstraintName". The conflict occurred in database "MyDatabase", table "dbo.Table3", column 'Col31'.
The statement has been terminated.

Я пробовал намеренно вставлять RAISERROR. Если так:

BEGIN TRAN
RAISERROR (N'in transaction', 16, 1)

DELETE FROM Table1 WHERE Col11=@ID
DELETE FROM Table2 WHERE Col21=@ID

COMMIT TRAN

то ошибка передаётся в клиент, а если так:

BEGIN TRAN

DELETE FROM Table1 WHERE Col11=@ID
RAISERROR (N'in transaction', 16, 1)
DELETE FROM Table2 WHERE Col21=@ID

COMMIT TRAN

то уже нет.

В первом DELETE в данном случае ошибка не возникает. Table1 имеет связь с Table3 только через Table2.
К Table2 привязан триггер на DELETE, который автоматически удаляет из Table3.
7 июл 11, 02:12    [10935870]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка не вылезает наружу внутри транзакции  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
версия сервера?
7 июл 11, 02:35    [10935892]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка не вылезает наружу внутри транзакции  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
BPK,

на всякий случай - try ... catch
7 июл 11, 02:39    [10935895]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка не вылезает наружу внутри транзакции  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
SET NOCOUNT ON

В первую строку хп.
7 июл 11, 08:15    [10936088]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка не вылезает наружу внутри транзакции  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
pkarklin
SET NOCOUNT ON
В первую строку хп.
Но ещё лучьше поправить приложение :-)

Понятно, что это баг клиента, раз другой клиент (SSMS) всё прекрасно показывает.
7 июл 11, 08:44    [10936179]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка не вылезает наружу внутри транзакции  [new]
BPK
Member

Откуда: ни: возьмись.
Сообщений: 1601
Makar4ik
BPK,

на всякий случай - try ... catch

Вроде бы должно и без TRY/CATCH работать.

pkarklin
SET NOCOUNT ON

В первую строку хп.

О, Великий! Бум об пол! Помогло.
Странно, что это влияет на выдачу ошибок.
7 июл 11, 10:31    [10936789]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка не вылезает наружу внутри транзакции  [new]
daw
Member

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

> Странно, что это влияет на выдачу ошибок.

а оно и не влияет. просто, ваш клиент не умеет правильно обработать то, что получает.

Posted via ActualForum NNTP Server 1.4

7 июл 11, 10:34    [10936819]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка не вылезает наружу внутри транзакции  [new]
BPK
Member

Откуда: ни: возьмись.
Сообщений: 1601
alexeyvg
pkarklin
SET NOCOUNT ON
В первую строку хп.
Но ещё лучьше поправить приложение :-)

Понятно, что это баг клиента, раз другой клиент (SSMS) всё прекрасно показывает.

Не охота рыться в Борландовских компонентах.
7 июл 11, 10:35    [10936834]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка не вылезает наружу внутри транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104751
BPK
alexeyvg
пропущено...
Но ещё лучьше поправить приложение :-)

Понятно, что это баг клиента, раз другой клиент (SSMS) всё прекрасно показывает.

Не охота рыться в Борландовских компонентах.

Дело не в компонентах, а в клиентском коде. Который не умеет обрабатывать _все_ результаты, которые возвращаются сервером.
7 июл 11, 10:41    [10936873]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка не вылезает наружу внутри транзакции  [new]
BPK
Member

Откуда: ни: возьмись.
Сообщений: 1601
Glory
BPK
пропущено...

Не охота рыться в Борландовских компонентах.

Дело не в компонентах, а в клиентском коде. Который не умеет обрабатывать _все_ результаты, которые возвращаются сервером.

Ну вот у меня обычный вызов TADOStoredProc.
Как обычно задаю соединение, имя ХП и параметры.
Обычно всё это работает.
Если я вставляю raise Exception.Create перед StoredProc.Open или после, исключение нормально обрабатывается.
ЧТО ещё ему надо?
7 июл 11, 12:21    [10937844]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка не вылезает наружу внутри транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104751
BPK
Обычно всё это работает.
Если я вставляю raise Exception.Create перед StoredProc.Open или после, исключение нормально обрабатывается.
ЧТО ещё ему надо?

нужно проверять все сообщения, которые возвращает сервер
7 июл 11, 12:25    [10937876]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка не вылезает наружу внутри транзакции  [new]
BPK
Member

Откуда: ни: возьмись.
Сообщений: 1601
BPK
StoredProc.Open

пардон, не open, а ExecProc.
7 июл 11, 12:27    [10937884]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка не вылезает наружу внутри транзакции  [new]
BPK
Member

Откуда: ни: возьмись.
Сообщений: 1601
Glory
BPK
Обычно всё это работает.
Если я вставляю raise Exception.Create перед StoredProc.Open или после, исключение нормально обрабатывается.
ЧТО ещё ему надо?

нужно проверять все сообщения, которые возвращает сервер

Я считал, что это забота борландовских компонентов переводить нужные сообщения от SQL Server в дельфийский Exception. Если этого не происходит, это косяк Борланда.
7 июл 11, 12:29    [10937899]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка не вылезает наружу внутри транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104751
BPK
Я считал, что это забота борландовских компонентов переводить нужные сообщения от SQL Server в дельфийский Exception. Если этого не происходит, это косяк Борланда.

А нужные - это какие ?
7 июл 11, 12:30    [10937906]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка не вылезает наружу внутри транзакции  [new]
BPK
Member

Откуда: ни: возьмись.
Сообщений: 1601
Glory
BPK
Я считал, что это забота борландовских компонентов переводить нужные сообщения от SQL Server в дельфийский Exception. Если этого не происходит, это косяк Борланда.

А нужные - это какие ?

О том, что произошла ошибка на уровне сервера.
7 июл 11, 12:35    [10937942]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка не вылезает наружу внутри транзакции  [new]
BPK
Member

Откуда: ни: возьмись.
Сообщений: 1601
Вроде нашёл перекликающуюся с этой тему.
7 июл 11, 12:48    [10938063]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить