Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.02.10;
Скачать: [xml.tar.bz2];

Вниз

Почему 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.012 c
4-29144
Igorek
2002-12-24 13:30
2003.02.10
Очистка очереди сообщений


14-29086
Игорь Досужев
2003-01-25 00:08
2003.02.10
О сатанизме и христианстве


9-28580
Dmitriy Polskoy
2002-08-29 18:10
2003.02.10
DelphiX для D6


1-28903
4rex
2003-01-31 05:03
2003.02.10
Как получить имя файла из ListBox и открыть этот файл в mplayer2


3-28618
vopros
2003-01-23 11:07
2003.02.10
Проблема с хранение jpg в Interbase





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский