Ошибка каскадирования базы данных - PullRequest
1 голос
/ 05 декабря 2009

В моей базе данных три таблицы: события, задания и CollectableEntities.

События имеют обнуляемый FK, указывающий на PK Джобса.

События и Задания имеют ненулевые FK (которые также являются PK этих таблиц), указывающие на PK CollectableEntities. Эти отношения FK установлены каскадно при обновлении и удалении. Обычно, когда вы удаляете CollectableEntity, я хочу, чтобы также были удалены связанные событие и / или задание.

Я сейчас пытаюсь изменить отношение «События к рабочим местам FK», чтобы установить нулевое значение при обновлении или удалении, но я получаю следующую ошибку:

Error SQL01268: .Net SqlClient Data Provider: Msg 1785, Level 16, State 0, Line 1 Introducing FOREIGN KEY constraint 'FK_Events_Jobs' on table 'Events' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

Где цикл? Как я могу избежать этой проблемы, учитывая, что приведенное выше описание - единственный эффект, который я хочу. (Я готов внести изменения, чтобы избежать других непредвиденных побочных эффектов.)

Ответы [ 2 ]

2 голосов
/ 05 декабря 2009

См. http://allyourdatabase.blogspot.com/2006/11/multiple-cascade-paths-error-in-sql.html

У вас очень похожая ситуация ... при удалении из коллекционирования будет предпринята попытка удаления из событий, что приведет к попытке удаления из заданий из-за FK из событий в задания. Но удаление из коллекционных также собирается попытаться удалить из рабочих мест из-за FK из коллекционных в рабочие места. Наличие рабочих мест в каскадном пути дважды является проблемой.

Возможно, я немного не в курсе специфики, поскольку вы не включили свою схему, но общий принцип должен быть верным.

2 голосов
/ 05 декабря 2009

вероятно, было бы намного проще пометить все как «удаленные», вместо того, чтобы фактически удалять данные из базы данных. поэтому в ваших таблицах у вас будет битовое поле с именем Deleted, которое по умолчанию имеет значение false. Затем, когда что-то удаляется, эта запись помечается как удаленная. После этого вы просто задали оператор where в своих запросах, чтобы удалить удаленные элементы, и все готово.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...