Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Introducing FOREIGN KEY constraint on table may cause cycles or multiple cascade paths  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7712
create table Office
(
  Id int not null /* identity */ constraint pk_Office primary key,
  OfcId int not null,
  constraint uk_Office unique (OfcId),
  OfcName nvarchar(256) not null
)

create table Users
(
  Id int not null /* identity */ constraint pk_Users primary key,
  UsrId int not null,
  UsrName nvarchar(256) not null,
  OfcId int not null,
  constraint uk_Users unique (OfcId, UsrId),
  constraint fk_Users_Office foreign key (OfcId) references Office on delete cascade
)

create table Types
(
  Id int not null /* identity */ constraint pk_Types primary key,
  TypId int not null,
  TypName nvarchar(256) not null,
  OfcId int not null,
  constraint uk_Types unique (OfcId, TypId),
  constraint fk_Types_Office foreign key (OfcId) references Office on delete cascade
)

create table Objects
(
  Id int not null /* identity */ constraint pk_Objects primary key,
  ObjId int not null,
  ObjName nvarchar(256) not null,
  OfcId int not null,
  UsrId int not null,
  TypId int not null,
  constraint fk_Objects_Office foreign key (OfcId) references Office on delete cascade,
  constraint fk_Objects_Users foreign key (UsrId) references Users on delete cascade,
  constraint fk_Objects_Types foreign key (TypId) references Types on delete cascade
)

select @@version
Microsoft SQL Server 2005 - 9.00.3042.00 (Intel X86) Feb 9 2007 22:47:07 Copyright (c) 1988-2005 Microsoft Corporation Express Edition on Windows NT 5.1 (Build 2600: Service Pack 3)

M$ SSMS 2008
Msg 1785, Level 16, State 0, Line 2
Introducing FOREIGN KEY constraint 'fk_Objects_Users' on table 'Objects' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Msg 1750, Level 16, State 0, Line 2
Could not create constraint. See previous errors.

В чем подвох?

P.S. WI-V6.3.4.18393 Firebird 2.1 - без проблем.
_________________
"Helo, word!" - 17 errors 56 warnings
2 дек 11, 07:50    [11693431]     Ответить | Цитировать Сообщить модератору
 Re: Introducing FOREIGN KEY constraint on table may cause cycles or multiple cascade paths  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Ex_Soft
В чем подвох?
Всё строго по документации:

BOL
Последовательности каскадных ссылочных действий, запускаемые отдельными инструкциями DELETE или UPDATE, должны образовывать дерево без циклических ссылок. Никакая таблица не должна появляться больше одного раза в списке всех каскадных ссылочных действий, вызванных инструкциями DELETE или UPDATE. Кроме того, в дереве каскадных ссылочных действий к любой из задействованных таблиц должен быть только один путь.
У вас из Objects ссылка на Office используется несколько раз - напрямую, через Users и через Types
2 дек 11, 08:39    [11693530]     Ответить | Цитировать Сообщить модератору
 Re: Introducing FOREIGN KEY constraint on table may cause cycles or multiple cascade paths  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7712
Ну как тогда следует организовать сию структуру?
2 дек 11, 10:39    [11694086]     Ответить | Цитировать Сообщить модератору
 Re: Introducing FOREIGN KEY constraint on table may cause cycles or multiple cascade paths  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Ex_Soft
Ну как тогда следует организовать сию структуру?
В триггере
2 дек 11, 10:47    [11694127]     Ответить | Цитировать Сообщить модератору
 Re: Introducing FOREIGN KEY constraint on table may cause cycles or multiple cascade paths  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7712
iap
В триггере

Это M$ SQL такую структуру штатными средствами одолеть не может или вопрос плавно переходит в Проектирование БД?
2 дек 11, 10:51    [11694156]     Ответить | Цитировать Сообщить модератору
 Re: Introducing FOREIGN KEY constraint on table may cause cycles or multiple cascade paths  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Ex_Soft
iap
В триггере

Это M$ SQL такую структуру штатными средствами одолеть не может или вопрос плавно переходит в Проектирование БД?
Microsoft про эти циклы в каскадных FOREIGN KEYsах говорит: "By design".

Мне-то, например, кажется, что в каскадах на удаление эти всякие циклы не должны играть никакой роли,
ибо одну и ту же запись всё равно нельзя удалить более одного раза (ведь DELETE-то нормально удаляет,
даже если одна запись присутствует дважды).
Но бороться с Microsoftом в этом вопросе - всё равно что ......
2 дек 11, 11:15    [11694398]     Ответить | Цитировать Сообщить модератору
 Re: Introducing FOREIGN KEY constraint on table may cause cycles or multiple cascade paths  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ex_Soft
Это M$ SQL такую структуру штатными средствами одолеть не может или вопрос плавно переходит в Проектирование БД?

второе
2 дек 11, 11:18    [11694423]     Ответить | Цитировать Сообщить модератору
 Re: Introducing FOREIGN KEY constraint on table may cause cycles or multiple cascade paths  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Glory
Ex_Soft
Это M$ SQL такую структуру штатными средствами одолеть не может или вопрос плавно переходит в Проектирование БД?

второе
Да в общем то это не обязательно ошибка проектирования - ссылки на Office из этих таблиц могут означать разные бизнес-понятия.

Просто сиквел такого не поддерживает, соответственно нужно просто отказаться от автоматического каскадного удаления или реализовать его триггером (но тогда придётся отказаться от констрейна, что хуже).
2 дек 11, 11:25    [11694480]     Ответить | Цитировать Сообщить модератору
 Re: Introducing FOREIGN KEY constraint on table may cause cycles or multiple cascade paths  [new]
Glory
Member

Откуда:
Сообщений: 104751
alexeyvg
Да в общем то это не обязательно ошибка проектирования - ссылки на Office из этих таблиц могут означать разные бизнес-понятия.

Ну так и надо решить кому принадлежит Object - Office или User ?
2 дек 11, 11:29    [11694524]     Ответить | Цитировать Сообщить модератору
 Re: Introducing FOREIGN KEY constraint on table may cause cycles or multiple cascade paths  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7712
Glory
второе

обоснуйте, pls...
2 дек 11, 11:29    [11694530]     Ответить | Цитировать Сообщить модератору
 Re: Introducing FOREIGN KEY constraint on table may cause cycles or multiple cascade paths  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ex_Soft
Glory
второе

обоснуйте, pls...

Ну так и надо решить кому принадлежит Object - Office или User ?
2 дек 11, 11:30    [11694538]     Ответить | Цитировать Сообщить модератору
 Re: Introducing FOREIGN KEY constraint on table may cause cycles or multiple cascade paths  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7712
Glory
Ну так и надо решить кому принадлежит Object - Office или User ?

User'у...
Но даже если удалить:
create table Objects
(
  Id int not null constraint pk_Objects primary key,
  ObjId int not null,
  ObjName nvarchar(256) not null,
  OfcId int not null, /* согласен - избыточен, но удаление проблему не решает */
  UsrId int not null,
  TypId int not null,
  constraint fk_Objects_Office foreign key (OfcId) references Office on delete cascade, /* см. коммент выше */
  constraint fk_Objects_Users foreign key (UsrId) references Users on delete cascade,
  constraint fk_Objects_Types foreign key (TypId) references Types on delete cascade
)

Все равно в M$ SQL'е это проблему не решает...
2 дек 11, 11:34    [11694582]     Ответить | Цитировать Сообщить модератору
 Re: Introducing FOREIGN KEY constraint on table may cause cycles or multiple cascade paths  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ex_Soft
Все равно в M$ SQL'е это проблему не решает...

Наверное потому, что проблем больше одной ?
Вы свою схему на бумажке рисовали ?
2 дек 11, 11:36    [11694617]     Ответить | Цитировать Сообщить модератору
 Re: Introducing FOREIGN KEY constraint on table may cause cycles or multiple cascade paths  [new]
iap
Member

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

а как контролируется принадлежность Objects.UsrId и Objects.TypId одному и тому же Office?
Или они могут относиться к разным офисам?
Но тогда один и тот же Objects будет неявно ссылаться на два разных Office?
2 дек 11, 11:42    [11694707]     Ответить | Цитировать Сообщить модератору
 Re: Introducing FOREIGN KEY constraint on table may cause cycles or multiple cascade paths  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7712
Glory
Вы свою схему на бумажке рисовали ?

И что в ней такого криминального?

Office - с этим понятно
Users - User в Office (раз юзаем OfcId не вижу препятствий поставить FK на Office)
Types - Type в Office (раз юзаем OfcId не вижу препятствий поставить FK на Office)
Objects - Object типа Type у юзера User (раз юзаем UsrId/TypId не вижу препятствий поставить FK на Users/Types)

Что не так?
2 дек 11, 11:43    [11694714]     Ответить | Цитировать Сообщить модератору
 Re: Introducing FOREIGN KEY constraint on table may cause cycles or multiple cascade paths  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7712
iap
а как контролируется принадлежность Objects.UsrId и Objects.TypId одному и тому же Office?
Или они могут относиться к разным офисам?
Но тогда один и тот же Objects будет неявно ссылаться на два разных Office?

+1
/me задумалсо...
2 дек 11, 11:44    [11694736]     Ответить | Цитировать Сообщить модератору
 Re: Introducing FOREIGN KEY constraint on table may cause cycles or multiple cascade paths  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ex_Soft
Office - с этим понятно
Users - User в Office (раз юзаем OfcId не вижу препятствий поставить FK на Office)
Types - Type в Office (раз юзаем OfcId не вижу препятствий поставить FK на Office)
Objects - Object типа Type у юзера User (раз юзаем UsrId/TypId не вижу препятствий поставить FK на Users/Types)

Что не так?

А Type у Office-а - это что тогда ?

Сообщение было отредактировано: 2 дек 11, 11:46
2 дек 11, 11:45    [11694747]     Ответить | Цитировать Сообщить модератору
 Re: Introducing FOREIGN KEY constraint on table may cause cycles or multiple cascade paths  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7712
iap
а как контролируется принадлежность Objects.UsrId и Objects.TypId одному и тому же Office?

На естественных ключах это - было (DDL# 1)
Получается криво на суррогатные перешли... Варианты?
2 дек 11, 11:48    [11694782]     Ответить | Цитировать Сообщить модератору
 Re: Introducing FOREIGN KEY constraint on table may cause cycles or multiple cascade paths  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Glory
alexeyvg
Да в общем то это не обязательно ошибка проектирования - ссылки на Office из этих таблиц могут означать разные бизнес-понятия.

Ну так и надо решить кому принадлежит Object - Office или User ?
Референс-констрейн - это не принадлежность в бизнес-понятиях :-)

Допустим, OfcId в Object - это тот офис, который купил объект.
А OfcId в Users - это тот офис, в котором работает пользователь, который использует объект, купленный в другом офисе.

Просто я не знаю бизнеса, который отражён в этой модели. Это может быть ошибка, а может и нет. Конечно, можно в проектировании задать на всякий случай вопрос, описав бизнес-логику, но это не обязательно 100% ошибка
iap
а как контролируется принадлежность Objects.UsrId и Objects.TypId одному и тому же Office?
Или они могут относиться к разным офисам?
Разумеется, по этой схеме могут, почему им бы не относиться к разным офисам?
2 дек 11, 11:49    [11694802]     Ответить | Цитировать Сообщить модератору
 Re: Introducing FOREIGN KEY constraint on table may cause cycles or multiple cascade paths  [new]
Glory
Member

Откуда:
Сообщений: 104751
alexeyvg
Просто я не знаю бизнеса, который отражён в этой модели. Это может быть ошибка, а может и нет. Конечно, можно в проектировании задать на всякий случай вопрос, описав бизнес-логику, но это не обязательно 100% ошибка

В проектировании вообще нет 100% ошибок
Есть возможность или не возможность решать на полученной структуре какие-то задачи
2 дек 11, 11:52    [11694834]     Ответить | Цитировать Сообщить модератору
 Re: Introducing FOREIGN KEY constraint on table may cause cycles or multiple cascade paths  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Ex_Soft
iap
а как контролируется принадлежность Objects.UsrId и Objects.TypId одному и тому же Office?

На естественных ключах это - было (DDL# 1)
Получается криво на суррогатные перешли... Варианты?
Вот только что хотел предложить Вам то, что по Вашей ссылке, за одним исключением:
в Objects не надо FK на Office.
2 дек 11, 11:52    [11694837]     Ответить | Цитировать Сообщить модератору
 Re: Introducing FOREIGN KEY constraint on table may cause cycles or multiple cascade paths  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
alexeyvg
Glory
пропущено...

Ну так и надо решить кому принадлежит Object - Office или User ?
Референс-констрейн - это не принадлежность в бизнес-понятиях :-)

Допустим, OfcId в Object - это тот офис, который купил объект.
А OfcId в Users - это тот офис, в котором работает пользователь, который использует объект, купленный в другом офисе.

Просто я не знаю бизнеса, который отражён в этой модели. Это может быть ошибка, а может и нет. Конечно, можно в проектировании задать на всякий случай вопрос, описав бизнес-логику, но это не обязательно 100% ошибка
iap
а как контролируется принадлежность Objects.UsrId и Objects.TypId одному и тому же Office?
Или они могут относиться к разным офисам?
Разумеется, по этой схеме могут, почему им бы не относиться к разным офисам?
А ещё ведь есть треться ссылка на Office, непосредственная! Может отличаться от двух других.
Если намешали такую кучу, то можно не удивляться, что что-то чему-то будет противоречить.
2 дек 11, 11:55    [11694870]     Ответить | Цитировать Сообщить модератору
 Re: Introducing FOREIGN KEY constraint on table may cause cycles or multiple cascade paths  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7712
Glory
А Type у Office-а - это что тогда ?

В физическом смысле?
2 дек 11, 11:56    [11694878]     Ответить | Цитировать Сообщить модератору
 Re: Introducing FOREIGN KEY constraint on table may cause cycles or multiple cascade paths  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ex_Soft
В физическом смысле?

В вашей схеме.
Type есть и у Office и у Object. При этом Object еще зависит и от Office
2 дек 11, 11:58    [11694917]     Ответить | Цитировать Сообщить модератору
 Re: Introducing FOREIGN KEY constraint on table may cause cycles or multiple cascade paths  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7712
iap
Вот только что хотел предложить Вам то, что по Вашей ссылке, за одним исключением:
в Objects не надо FK на Office.

M$ SQL это тоже ниасилил даже на этапе создания таблиц... Не говоря уж об update/delete...
2 дек 11, 12:00    [11694948]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить