Текущий архив: 2003.02.10;
Скачать: CL | DM;
ВнизПочему MS-SQL не дает построть такую связь? Найти похожие ветки
← →
FLIZ (2003-01-24 12:01) [0]всем привет, наткнулся на то что MS-SQL Server 2000 не разрешает
построить связи и мне непонятно почему.
есть таблицы Задачи (здесь даю русские наименования для
простоты понимания сути), в ней два поля КемВыдана, и КомуВыдана.
Эти поля есть "айдишники" людей в т-це Люди.
так вот, хочу построить две связи "1 ко многим" от
Человек ----->> КомуВыдана
Человек ----->> КемВыдана
с поддержкой каскадности по удалению и изменению.
другими словами, в т-це есть два форейн-кея, по кот. устанавливается связь на один и тот же примарикей
в мастер-таблице.
и сервер не дает это сделать!
но почему? не могу придумать пример, в котором такие связи
привели бы к ошибке. при удалении человека я намеренно
хочу удалить и задачи которые он выдал, и которые ему выдали.
знатоки, объясните в чем тут вешь?
спасибо
← →
Reindeer Moss Eater (2003-01-24 12:07) [1]и сервер не дает это сделать!
Каким образом?
← →
FLIZ (2003-01-24 12:12) [2]сорри, действительно не сказал.
он пишет вот такой вот ответ при попытке сохранить диаграмму связей:
ODBC error: [Microsoft][ODBC SQL Server Driver][SQL Server]Introducing FOREIGN KEY constraint "FK_tbSecond_2_tbMaster3" on table "tbSecond_2" may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
← →
Reindeer Moss Eater (2003-01-24 12:13) [3]Так и пишет что ли : "Не дам, мол, сделать такую связь, ибо считаю что неверная она. Не могут человеки так объединяться" ?
← →
Reindeer Moss Eater (2003-01-24 12:14) [4]Ну а теперь еще догадайся, что сам запрос неплохо бы привести.
← →
MOA (2003-01-24 12:22) [5]А в сообщении об ошибке сервер явно сказал Вам, что ему не нравится.
Вы, видимо, сказали ему ON DELETE СASCADE или ON UPDATE CASCADE в обоих связях. И теперь сервер в непонятках - как же ему эти каскадные обновления-удаления делать. И даёт Вам соответсвующую рекомендацию.
Удачи!
← →
FLIZ (2003-01-24 12:24) [6]"ну а теперь еще догадайся ..."
извините, коллега, а что за тон? не слишком назидательно?
извините, к подобному не привык.
какого запроса? я связи рисую в режиме конструирования
диаграммы в ЭнтерПрайз менеджере. мышкой с таблички на табличку.
если диаграмму можно как-то представить в виде
запроса, то прошу подсказать как это делается.
что что я начинающий в этом, навереное уже понятно.
и огласите весь список нужной для решения проблемы информации.
← →
FLIZ (2003-01-24 12:27) [7]2 MOA © (24.01.03 12:22)
я прекрасно понимаю что он не хочет установить из-за
каскадности. это я понял.
я не понимаю ПОЧЕМУ ЭТО нельзя?
блин, ребята, ну я же подробно описал что мне надо сделать.
вы можете сказать почуем это "не проходит"?
Аксесс и Оракл например без проблем решили задачу.
а этот не хочет?!
← →
Chubais (2003-01-24 12:28) [8]
> FLIZ © (24.01.03 12:24)
> "ну а теперь еще догадайся ..."
> извините, коллега, а что за тон? не слишком назидательно?
> извините, к подобному не привык.
> и огласите весь список нужной для решения проблемы информации.
← →
FLIZ (2003-01-24 12:30) [9]2 Chubais © (24.01.03 12:28)
вы о чем?
← →
MOA (2003-01-24 12:33) [10]Цитата из BOL:
No table can appear more than once in the list of all cascading referential actions that result from the DELETE or UPDATE.
Видимо, MS SQL не пытается отследить циклы, а тупо считает количество вхождений таблицы, и если больше 1 раза - кричит об ошибке.
Удачи!
← →
FLIZ (2003-01-24 12:55) [11]2 MOA © (24.01.03 12:33)
если это так то это конечно печально, потому как сама постановка
задачи скорее всего корректна. по кр. мере никто мне не смог
привести пример когда эти связи приведут к ошибкам.
но с другой стороны, странно что у такого мощного сервака
такой "детский" глюк. неужели никто не натыкался на такое?
верится в это с трудом, наверное я что-то не так делаю...
ладно, спасибо за помошь!
← →
Reindeer Moss Eater (2003-01-24 13:25) [12]Fliz, а мы коллеги? Не слишком ли самонадеяно?
А про "догадайся" - приходится напоминать, если сам не в состоянии.
Пока.
← →
MOA (2003-01-24 13:38) [13]Попробовал - ну да, в BOL написано верно ;) - нельзя. Очевидно, связано со стремлением повысить быстродействие - отслеживание циклов в большой базе довольно сложно, а тут можно обойтись просто селектом.
Да и стремление обойти циклы - тоже не очевидно. Ну будут циклы, и что? Видимо, связано с архитектурой MSSQL - триггеры срабатывают один раз на операцию, а в случае цикла это не так, в случае более одной связи к таблице - тоже, без повторного срабатывания триггера не обойтись, или придётся очень сложным путём формировать таблицы inserted и deleted.
Так что, видимо, Вам не обойтись без триггера на удаление - обновление.
Кстати, а в реальной жизни , то бишь в предметной области - если человек уволился-умер, все работы, которые он раздал - прекращаются? И идентификаторы, уникально характеризующие человека - меняются?
Удачи!
← →
FLIZ (2003-01-24 14:00) [14]2 Reindeer Moss Eater (24.01.03 13:25)
я виже вместо созидательного направления помощи вы выбрали
агрессивно-направленный не сказать похлеще.
но вы же по существу проблемы то нифига мне не ответили!
ну и чего? сами не знаете,или что? зато поучительный тон любите...
вы хоть чем то мне помогли? ничем, абсолютно.
просто пежонство какое-то, не хотел говорить но сами напросились.
догадливость у вас громадная а помоши от вас мне ноль.
так что пока-пока и вам того же.
--------------------------
2 MOA © (24.01.03 13:38)
да, если удаляется человек из базы то по постановке задачи
абсолютно нормально удалить все что он кому то назначил
и все что ему назначили.
идентификаторы людей менятся не должны.
понятное дело что это все можно запрограммировать, "обойти"
эту неприятность,и вообще решить задачу в целом.
но стало весьма интересно почему он (сервер) так себя ведет?
не обходить же это каждый раз :-))
еще раз спасибо.
З.Ы.
что такое BOL? (ну чайник, я чайник :-))
← →
Reindeer Moss Eater (2003-01-24 14:10) [15]FLIZ, да ради бога.
А если я ничем так и не смог помочь, то вот, наздоровье:
п ежонство пишется через букву "и",
а помо ш через щ
Хоть какая-то польза от общения пусть да будет.
← →
MOA (2003-01-24 14:22) [16]BOL - это Book OnLine, из комплекта установки MS SQL.
Вас интересует раздел "Cascading Referential Integrity Constraints".
Однако, мне по крайней мере, ни разу не понадобилось подобное ограничение - м.б., это симптом неадектватной постановки?
Удачи!
← →
FLIZ (2003-01-24 14:51) [17]2 MOA © (24.01.03 14:22)
насчет неадекватной постановки, ну не знаю, не знаю...
вот еще примерчик тогда.
допустим есть справочник городов, и есть таблица какого-нить скажем склада, что-ли. и там несколько полей, скажем город-отправитель,
город-получатель, город-перевалочный пункт. а теперь удаляем
город из справочника. и если в постановке задачи не сказано
что надо вести архив, то почему бы не удалить записи,
указанные города в которых уже удалены из справочника?
это я так, "навскидку" пример написал.
да черт с ним, с примером.
интересно понять - это глюк сервера или документированная
особенность? вот в чем соль-то. а если негде не сказано что
так делать нельзя, то получается что MS-SQL по данному
пункту слабее примитивного Аксесса что-ли?
он то такую вешь позволяет и корректно ее обрабатывает.
← →
MOA (2003-01-24 15:34) [18]Это документированное поведение. BOL - это официальная документация к MSSQL, и там в разделе "Cascading Referential Integrity Constraints" описывается именно такое поведение сервера.
Удачи!
← →
FLIZ (2003-01-24 15:44) [19]2 MOA © (24.01.03 15:34)
точно! дошло до меня, дошло!
суть в том что через связи от одной т-це к другой
можно "прийти" (если свзяь считать "путем") не более
чем через один путь.
&*^*&^*&? ну и уроды они, ?*:?*:
а Вам лично ОГРОМНОЕ СПАСИБО, что помогли разобратся!
Страницы: 1 вся ветка
Текущий архив: 2003.02.10;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.011 c