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

Откуда: Прага
Сообщений: 247
Добрый день!
Мучаемся тут с коллегой по одному вопросу: нужно клиенту показывать возможность / невозможность удаления позиций из таблиц, которые могут быть связаны по Constrains.
Например 2 таблицы: Cities (ID,title,CountryID), Countries (ID, Title) связаны по CountryID->(1..n)->ID.

Так вот, как бы на основании Constrins проверять при удалении из Countries, есть ли связанные данные в таблице Cities или нет (просто да/нет).
Сейчас при удалении позиции, имеющей детей клиент получает сообщение об ошибке БД, что, конечно, неприемлемо.
Пример упрощенный, обычно связей может быть около 5.
Сейчас проверяем всё просто -- SELECT COUNT(*) FROM City WHERE CountryID=X ... и тд по количеству связей. Можно ли как то это упростить?

Спасибо!
13 июл 11, 16:22    [10968582]     Ответить | Цитировать Сообщить модератору
 Re: Constraint и связанные данные  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Может, просто ошибку обработать по-человечески?
13 июл 11, 16:24    [10968595]     Ответить | Цитировать Сообщить модератору
 Re: Constraint и связанные данные  [new]
cavalero
Member

Откуда: Прага
Сообщений: 247
Нужно ответить на 2 вопроса: можно ли удалить, и если нельзя, то где используются данные.

Т.е. с той же страной:
шаг 1: Можно ли удалить (есть ли дети).
шаг 2: детей нет -- удаляем, есть -- показываем список городов, где страна используется

Это упрощенно.
13 июл 11, 16:28    [10968649]     Ответить | Цитировать Сообщить модератору
 Re: Constraint и связанные данные  [new]
step_ks
Member

Откуда:
Сообщений: 936
а что не получается-то?
13 июл 11, 18:14    [10969468]     Ответить | Цитировать Сообщить модератору
 Re: Constraint и связанные данные  [new]
Glory
Member

Откуда:
Сообщений: 104751
cavalero
Нужно ответить на 2 вопроса: можно ли удалить, и если нельзя, то где используются данные.

Т.е. с той же страной:
шаг 1: Можно ли удалить (есть ли дети).
шаг 2: детей нет -- удаляем, есть -- показываем список городов, где страна используется


Ну так сообщение об ошибке, которое выдаст constraint, отвечает на оба вопроса
13 июл 11, 18:16    [10969488]     Ответить | Цитировать Сообщить модератору
 Re: Constraint и связанные данные  [new]
cavalero
Member

Откуда: Прага
Сообщений: 247
Хм, насколько я помню это сообщение, .NET выводит только Exception о том, что данная операция не может быть проведена т.к. есть Constraint такой то и он не позволяет удалить данные. А мне нужно следующее:

Нельзя удалить Germany т.к. в ней есть Berlin,Bremen, Hamburg etc.
13 июл 11, 18:23    [10969527]     Ответить | Цитировать Сообщить модератору
 Re: Constraint и связанные данные  [new]
Glory
Member

Откуда:
Сообщений: 104751
cavalero

Нельзя удалить Germany т.к. в ней есть Berlin,Bremen, Hamburg etc.

И еще список из 100500 наименований ?
Если пользователь так жадает видеть такой список то пусть пишет соответствующий запрос
А для срабатывания констрейнта достаточно одного нарушения
13 июл 11, 18:26    [10969547]     Ответить | Цитировать Сообщить модератору
 Re: Constraint и связанные данные  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
cavalero
Нельзя удалить Germany т.к. в ней есть Berlin,Bremen, Hamburg etc.
Берете и пишите код, который будет удалять, а если нельзя - выводить нужное сообщение.
13 июл 11, 18:30    [10969581]     Ответить | Цитировать Сообщить модератору
 Re: Constraint и связанные данные  [new]
cavalero
Member

Откуда: Прага
Сообщений: 247
Glory
cavalero
Нельзя удалить Germany т.к. в ней есть Berlin,Bremen, Hamburg etc.

И еще список из 100500 наименований ?
Если пользователь так жадает видеть такой список то пусть пишет соответствующий запрос
А для срабатывания констрейнта достаточно одного нарушения


В случае страны -- да, результатов может быть прилично (с пейджингом пойдет), но есть объекты в системе, которые надо точно выводить.
Например: мы продали услугу и не можем ее удалить пока она есть в необработанных заказах. Показываем список заказов.

Вопрос то в общем то один -- можно ли как то проверить не наличие Constraint, а фактическое наличие данных в таблицах, связанных этим Constraint. Т.е. получить ответ да/нет.
Сорри, если сумбурно объясняю.

Спасибо!
13 июл 11, 18:34    [10969616]     Ответить | Цитировать Сообщить модератору
 Re: Constraint и связанные данные  [new]
Glory
Member

Откуда:
Сообщений: 104751
cavalero
Вопрос то в общем то один -- можно ли как то проверить не наличие Constraint, а фактическое наличие данных в таблицах, связанных этим Constraint. Т.е. получить ответ да/нет.
Сорри, если сумбурно объясняю.

Т.е. проблема написать select из двух таблиц что ли ?
И ошибка констрейнта разве не является ответом "нет" ?

Сообщение было отредактировано: 13 июл 11, 18:36
13 июл 11, 18:35    [10969624]     Ответить | Цитировать Сообщить модератору
 Re: Constraint и связанные данные  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
cavalero
Вопрос то в общем то один -- можно ли как то проверить не наличие Constraint, а фактическое наличие данных в таблицах, связанных этим Constraint. Т.е. получить ответ да/нет.
Возможности сделать что-то, ничего при этом не делая, нет.
13 июл 11, 18:38    [10969644]     Ответить | Цитировать Сообщить модератору
 Re: Constraint и связанные данные  [new]
cavalero
Member

Откуда: Прага
Сообщений: 247
Гавриленко Сергей Алексеевич
cavalero
Нельзя удалить Germany т.к. в ней есть Berlin,Bremen, Hamburg etc.
Берете и пишите код, который будет удалять, а если нельзя - выводить нужное сообщение.



Пишем :) Просто хотелось срезать и не писать что то типа в духе:

		SELECT @res = convert(bit,
			ISNULL(
				(
					SELECT COUNT(*)
					FROM City C
					WHERE C.COuntry=@id	
				)	
			


а что то в духе
-- Value 1053183 shows objects that the specified object is dependent on
EXEC sp_MSdependencies N'HumanResources.[Employee]', null, 1053183

-- +проверка, что если есть результаты, то 1, если нет -- 0

Это наверное не то, но просто сторона в которую я думаю.
13 июл 11, 18:40    [10969660]     Ответить | Цитировать Сообщить модератору
 Re: Constraint и связанные данные  [new]
Glory
Member

Откуда:
Сообщений: 104751
cavalero

Это наверное не то, но просто сторона в которую я думаю.

Вы знаете конструкцию JOIN ?
13 июл 11, 18:42    [10969673]     Ответить | Цитировать Сообщить модератору
 Re: Constraint и связанные данные  [new]
cavalero
Member

Откуда: Прага
Сообщений: 247
Glory
cavalero
Это наверное не то, но просто сторона в которую я думаю.

Вы знаете конструкцию JOIN ?


Да. Я понимаю в какую сторону вы клоните. Но это относится к деталям решения "вручную посчитать всех child'ов".
13 июл 11, 18:48    [10969725]     Ответить | Цитировать Сообщить модератору
 Re: Constraint и связанные данные  [new]
Glory
Member

Откуда:
Сообщений: 104751
cavalero
Glory
пропущено...

Вы знаете конструкцию JOIN ?


Да. Я понимаю в какую сторону вы клоните. Но это относится к деталям решения "вручную посчитать всех child'ов".

Для ответа на вопрос "да/нет" не нужно ничего считать
13 июл 11, 18:52    [10969761]     Ответить | Цитировать Сообщить модератору
 Re: Constraint и связанные данные  [new]
cavalero
Member

Откуда: Прага
Сообщений: 247
Glory
cavalero
пропущено...


Да. Я понимаю в какую сторону вы клоните. Но это относится к деталям решения "вручную посчитать всех child'ов".

Для ответа на вопрос "да/нет" не нужно ничего считать



Это понятно exists/not exists. Просто нужно этот join написать еще. А при создании БД эти связи уже заданы явно.
MS SQL хранит данные, на основании которых обеспечивается целостность данных. Т.е. ответ (да/нет) на вопрос "есть ли childs" есть в БД. Вопрос как его вытащить, если это вообще возможно.
Я почему на эту тему так много пишу -- таблиц штук 40, связей много и хочется сократить время на написание join-ov, если такая возможность конечно существует.
13 июл 11, 18:58    [10969804]     Ответить | Цитировать Сообщить модератору
 Re: Constraint и связанные данные  [new]
Glory
Member

Откуда:
Сообщений: 104751
cavalero
Я почему на эту тему так много пишу -- таблиц штук 40, связей много и хочется сократить время на написание join-ov, если такая возможность конечно существует.

Так в чем проблема то ?
Получить список FK constraint-ов с имена таблиц что ли ?
13 июл 11, 19:02    [10969824]     Ответить | Цитировать Сообщить модератору
 Re: Constraint и связанные данные  [new]
cavalero
Member

Откуда: Прага
Сообщений: 247
Glory
cavalero
Я почему на эту тему так много пишу -- таблиц штук 40, связей много и хочется сократить время на написание join-ov, если такая возможность конечно существует.

Так в чем проблема то ?
Получить список FK constraint-ов с имена таблиц что ли ?


Да, с уточнением: если есть связанные данные.
Например:
Countries
id 1, title Russia
id 2, title Belarus
----------------
Cities
countryid 1, title Moscow
countryid 1, title Bryansk

FK constraint [Countries][id] 1..n [Cities][Countryid]

Произвольный вопрос к DB Engine звучит так: Есть ли в любой связанной с Countries constraint'ом таблице данные для, id = 1.
Для Russia ответ будет - ДА, для Belarus -- НЕТ.

В примере проще, конечно, в эти дебри не лезть, а выполнить проверку exists / not exists.
А если Countries связана с 10ю таблицами... И таких таблиц как Countries на проверку наличия childs тоже много... Вот тут и возникает желание обратиться к constraint'am.

Всем спасибо.
13 июл 11, 20:40    [10970055]     Ответить | Цитировать Сообщить модератору
 Re: Constraint и связанные данные  [new]
step_ks
Member

Откуда:
Сообщений: 936
cavalero
А если Countries связана с 10ю таблицами... И таких таблиц как Countries на проверку наличия childs тоже много... Вот тут и возникает желание обратиться к constraint'am.

Констрайнт при удалении из Countries обругается только на какую-нибудь одну таблицу с FK, даже если есть связи на 10.
14 июл 11, 08:55    [10971156]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить