| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > MS SQL Server > INSERT and UPDATE specification |
| Автор: amarenkov 30.6.2009, 07:49 |
| Добрый день. СУБД: MS SQL Server 2008 Express. Есть дочерняя таблица, у которой два поля ссылаются на родительскую таблицу. Связь 0..1 - n. На обеих связях ставлю INSERT and UPDATE specification следующим образом: Delete rule - Set NULL, Update Rule - Cascade. Microsoft SQL Server Management Studio генерирует ошибку: "- Unable to create relationship ... Introducing FOREIGN KEY constraint ... on table ... may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints." Я не могу понять, каким образом могут получиться циклы и чем страшны множественные каскадные пути? И как мне иначе при удалении родительской записи поля в дочерней выставить в NULL? Заранее спасибо |
| Автор: Idsa 30.6.2009, 07:57 |
| amarenkov, переношу тему в профильный раздел. Насколько я знаю, в SQL Server эту проблему можно разрулить только при помощи тригеров. |
| Автор: Itsys 30.6.2009, 21:08 |
| amarenkov, Я из описания не понял ничего... Лучше напиши чего ты хочешь добиться. |
| Автор: amarenkov 1.7.2009, 08:14 |
| Itsys, легко Есть таблица шапки организации (наименование, инн, адресс). Есть таблица организаций-плательщиков (много разных полей). Во второй таблице есть так же поля: Организация-правопередатчик и Вышестоящая организация. Эти поля ссылаются на первую таблицу. Так вот, мне необходимо, чтобы при удалении из первой таблицы эти два поля во второй становились NULL. Но в Delete Rule для этих двух связей выставить Set NULL не получается - ошибка (в первом посте ее текст). |
| Автор: Idsa 1.7.2009, 08:26 |
| Некоторое время назад сам интересовался этим вопросом на sql.ru: http://www.sql.ru/forum/actualthread.aspx?tid=645122 |
| Автор: amarenkov 1.7.2009, 09:29 |
| Idsa, спасибо |
| Автор: thomas 1.7.2009, 10:04 | ||
| amarenkov, Приветствую. А вот это
Вы там при проектировании своей БД ничего не напутали и не перемудрили? Подумайте еще раз какие данные должны у Вас сохраняться в БД и проведите НОРМАЛИЗАЦИЮ, скорее всего проблемы отпадут. И еще раз обдумайте бизнес-процесс. Если необходимость удалять "шапку", когда есть дочерние записи? Если да, то удалять надо в обоих таблицах, если нет, то помечать запись о "шапке" как не активную. У меня на пример так сделано по клиентуре с их фактурами и по фактурам с товарами в них. Даже если клиента больше нет, то фактуры то остались и соответственно если товара нет, то фактуры то есть. Ну а если уж у вас такая "хитрая" бизнес логика, то триггер самое то. |
| Автор: amarenkov 1.7.2009, 14:11 |
| thomas, да нет, ничего не намудрил, и нормализация здесь не нужна. У Idsa почти такой же http://www.sql.ru/forum/actualthread.aspx?tid=645122, посмотрите, если мой непонятен. |