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

Откуда: Москва
Сообщений: 1176
добрый день.
если происходит проблема при удалении Constraint, и сия операция находится в блоке try, то на Error_Message() вернет чудесное сообщение "Could not drop constraint. See previous errors."
как дотянуться до этого сообщения из кетча?

 begin try
	alter table spr.[KDB] drop constraint UK_spr_XXXXXX
 end try
 begin catch
	print Error_Message()

 end catch


Microsoft SQL Server 2008 R2 (SP1) - 10.50.2550.0 (X64)
Jun 11 2012 16:41:53
Copyright (c) Microsoft Corporation
Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64)
Jun 28 2012 08:36:30
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)
9 окт 13, 15:12    [14945436]     Ответить | Цитировать Сообщить модератору
 Re: drop constraint + try + предыдущие ошибки  [new]
Гость333
Member

Откуда:
Сообщений: 3683
 begin try
	exec('alter table spr.[KDB] drop constraint UK_spr_XXXXXX');
 end try
 begin catch
	print Error_Message()
 end catch
9 окт 13, 15:18    [14945503]     Ответить | Цитировать Сообщить модератору
 Re: drop constraint + try + предыдущие ошибки  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Гость333, результат при динамическом абсолютно такой же
9 окт 13, 15:24    [14945572]     Ответить | Цитировать Сообщить модератору
 Re: drop constraint + try + предыдущие ошибки  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Уберите try..catch - получите обе ошибки. Задача то какая решается?
9 окт 13, 15:29    [14945621]     Ответить | Цитировать Сообщить модератору
 Re: drop constraint + try + предыдущие ошибки  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Mike_za
Гость333, результат при динамическом абсолютно такой же

Ну не совсем... если таблица не существует, то выполнение батча будет прервано и не дойдёт до блока CATCH.

Но я понял, о чём вы спрашиваете. К сожалению, в блоке CATCH доступна лишь последняя ошибка.
9 окт 13, 15:41    [14945721]     Ответить | Цитировать Сообщить модератору
 Re: drop constraint + try + предыдущие ошибки  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Гость333, тут возможны разные варианты. например на ключ ссылаются релейшены, ключа действительно не сущетвует, ссылаются записи... и прочее

я так понимаю, что это какая-то известная проблема? есть что-то в документации на этот счет, и пути решения?
9 окт 13, 15:46    [14945777]     Ответить | Цитировать Сообщить модератору
 Re: drop constraint + try + предыдущие ошибки  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10232
Блог
Mike_za
Гость333, тут возможны разные варианты. например на ключ ссылаются релейшены, ключа действительно не сущетвует, ссылаются записи... и прочее

я так понимаю, что это какая-то известная проблема? есть что-то в документации на этот счет, и пути решения?


старый буган :) но можно вернуть весь стек ошибок в блоке catch с помощью throw (если версия позволяет)
9 окт 13, 15:51    [14945818]     Ответить | Цитировать Сообщить модератору
 Re: drop constraint + try + предыдущие ошибки  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Mike_za
это какая-то известная проблема?

Вот, например, на Коннекте она есть: TRY/ CATCH construct catches last error only
9 окт 13, 15:54    [14945849]     Ответить | Цитировать Сообщить модератору
 Re: drop constraint + try + предыдущие ошибки  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
pkarklin
Уберите try..catch - получите обе ошибки. Задача то какая решается?


процедура создает и модифицирует структуру некой сущности. При этом выполняется масса DDL инструкций. Вся логика на сервере
а в блоке Catch откатывается транзакция, собирается ошибка (+ доклеивается ошибка самого сервера), и отправляется наружу клиенту.


Kyazev Alexey
но можно вернуть весь стек ошибок в блоке catch с помощью throw (если версия позволяет)

к сожалению, версия не позволяет.

Гость333
Mike_za
это какая-то известная проблема?

Вот, например, на Коннекте она есть: TRY/ CATCH construct catches last error only

Спасибо
9 окт 13, 17:24    [14946619]     Ответить | Цитировать Сообщить модератору
 Re: drop constraint + try + предыдущие ошибки  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Mike_za,

автор
процедура создает и модифицирует структуру некой сущности. При этом выполняется масса DDL инструкций. Вся логика на сервере
а в блоке Catch откатывается транзакция, собирается ошибка (+ доклеивается ошибка самого сервера), и отправляется наружу клиенту.



Не понимаю. Зачем сначала давить экспепшен, чтоб потом с извратом его вытаскивать?! Для модификации структуры логика сервера не нужна. Нужно запустить нормальный набор DDL инструкций и получить ошибки, в том числе и в файл.
9 окт 13, 17:32    [14946663]     Ответить | Цитировать Сообщить модератору
 Re: drop constraint + try + предыдущие ошибки  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
pkarklin,

нормальный набор ддл инструкций запускать с клиента?
9 окт 13, 18:08    [14946887]     Ответить | Цитировать Сообщить модератору
 Re: drop constraint + try + предыдущие ошибки  [new]
Уленшпигель
Member

Откуда:
Сообщений: 115
Mike_za, судя по всему, вы получаете сообщение о последней ошибке. И это ошибка №3727. Перед ней была настоящая, но она потеряна. Удалить ограничение, чаще всего, нельзя потому что

1) ограничения с таким именем нет
2) у вас нет прав на его удаление
3) удаление блокируется блокировкой :), т.е. таблицей пользуется кто-то еще.

Уберите try и посмотрите все ошибки, которые происходят в процессе.
9 окт 13, 20:00    [14947283]     Ответить | Цитировать Сообщить модератору
 Re: drop constraint + try + предыдущие ошибки  [new]
Уленшпигель
Member

Откуда:
Сообщений: 115
Mike_za
нормальный набор ддл инструкций запускать с клиента?


Откуда у годно. Вас же уже спросили: в чем задача заключается? Получить сообщение на клиенте? Или устранить проблему? Если первое - то надо знать какими компонентами доступа пользуетесь на клиенте. Если второе - то надо узнать, в чем, собственно, проблема.
9 окт 13, 20:18    [14947315]     Ответить | Цитировать Сообщить модератору
 Re: drop constraint + try + предыдущие ошибки  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Mike_za
нормальный набор ддл инструкций запускать с клиента?


Да! Как минимум странно накатывать очередной хотфикс на сервер, городя для этого на сервере городушки.
9 окт 13, 21:11    [14947470]     Ответить | Цитировать Сообщить модератору
 Re: drop constraint + try + предыдущие ошибки  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Уленшпигель
Откуда у годно. Вас же уже спросили: в чем задача заключается? Получить сообщение на клиенте? Или устранить проблему? Если первое - то надо знать какими компонентами доступа пользуетесь на клиенте. Если второе - то надо узнать, в чем, собственно, проблема.
как я написал в своем первом сообщении, моя проблема заключается в получении первой ошибки из обработчика.

pkarklin
Да! Как минимум странно накатывать очередной хотфикс на сервер, городя для этого на сервере городушки.


У нашего продукта очень много пользователей со своими собственными серверами, на которые регулярно накатываются обновления базы данных.
На клиенте есть дизайнеры "документов" и "справочников". при этом на сервере создаются реальные хранилища (несколько таблиц) под каждый объект.

Имеем больше 10тысяч таблиц. и кучу динамического SQL.
В частности, мы поимели проблемы при удалении записи из таблицы, на которую ведут связи от нескольких сотен таблиц. Вы сталкивались?

какая-то бизнес логика есть в среднем слое на шарпе. Но основной объем кода, касающийся работы с объектами базы данных (таблицы, ключи, связи) лежит в процедурах. Разработчики клиентской части на SQL НЕ пишут. Плюс, все что связано с правами доступа, разруливается на уровне сервера. Пользователю даются права на вызов "процедуры-редактора" структуры документа или справочника, но при этом его учетка не имеет прав напрямую модифицировать структуры таблиц, и он не сможет ничего "разломать структуру", зайдя через студию, в обход логики процедуры

Такая архитектура "исторически сложилась" и менять ее уже возможности нет
10 окт 13, 12:07    [14949603]     Ответить | Цитировать Сообщить модератору
 Re: drop constraint + try + предыдущие ошибки  [new]
Уленшпигель
Member

Откуда:
Сообщений: 115
Mike_za
моя проблема заключается в получении первой ошибки из обработчика.


Mike_za
какая-то бизнес логика есть в среднем слое на шарпе.


Т.е., если я правильно понял, вы используете ADO.NET. Тогда, возможно, вам поможет это. Но только если убрать try в tsql.
10 окт 13, 20:06    [14953129]     Ответить | Цитировать Сообщить модератору
 Re: drop constraint + try + предыдущие ошибки  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
вопрос именно про "НЕ УБИРАТЬ TRY"
11 окт 13, 12:08    [14955734]     Ответить | Цитировать Сообщить модератору
 Re: drop constraint + try + предыдущие ошибки  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Mike_za,

Можно убрать TRY из скрипта на T-SQL.
Но оставить try в вашей программе-клиенте.
11 окт 13, 12:16    [14955802]     Ответить | Цитировать Сообщить модератору
 Re: drop constraint + try + предыдущие ошибки  [new]
pkarklin
Member

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


Да, сталкиваюсь постоянно.

автор
Разработчики клиентской части на SQL НЕ пишут. Плюс, все что связано с правами доступа, разруливается на уровне сервера. Пользователю даются права на вызов "процедуры-редактора" структуры документа или справочника, но при этом его учетка не имеет прав напрямую модифицировать структуры таблиц, и он не сможет ничего "разломать структуру", зайдя через студию, в обход логики процедуры


А я и не говорил, что накатывание заплат на бд - это дело обычного пользователя. А DBA имеют необходимые права и с ошибками разберутся.
11 окт 13, 12:27    [14955894]     Ответить | Цитировать Сообщить модератору
 Re: drop constraint + try + предыдущие ошибки  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
pkarklin, процедуры модификации структуры вызываются не только с клиента, но и из процедур миграции с сервера. и тогда открываться и откатываться транзакция будет уже из нескольких разных мест
11 окт 13, 17:35    [14957870]     Ответить | Цитировать Сообщить модератору
 Re: drop constraint + try + предыдущие ошибки  [new]
Уленшпигель
Member

Откуда:
Сообщений: 115
Mike_za
вопрос именно про "НЕ УБИРАТЬ TRY"


задача не имеет решения :) :(
11 окт 13, 20:18    [14958355]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить