SQL Server, каскадное удаление и родительская / дочерняя таблица - PullRequest
3 голосов
/ 16 сентября 2009

у меня есть одна простая таблица со следующими столбцами: id, name и parentID

я создал диаграмму отношений между id и parentID (в той же таблице), как простое дерево, в той же таблице, но когда я попытался удалить каскад пользователя, он был отключен для меня

я знаю, что это будет рекурсивное удаление, если я удалю родителя, это удалит его потомков

Есть ли у меня какие-либо варианты удаления каскада без триггеров?

Ответы [ 3 ]

3 голосов
/ 16 сентября 2009

Нет, SQL Server не допускает рекурсивные и / или множественные каскадные пути.

Вы можете использовать хранимую процедуру для удаления побитно или использовать триггер. К сожалению.

1 голос
/ 16 сентября 2009

Один вариант, который может работать для вас:

  • Поместите ParentID и ChildID в отдельную таблицу, удалите ParentID из базовой таблицы
  • Каскадное удаление, основанное исключительно на ID -> ParentID

Проблема в том, что при удалении дочернего элемента вы не удаляете ссылку из его родителя, а при удалении родительского элемента не удаляются ссылки из его дети любым внукам.

Однако вы можете обойти это в своем приложении, всегда используя INNER JOIN против ParentID и ChildID, поэтому любой оставшийся пух в таблице Parent / Child будет игнорироваться.

Затем вы можете запускать хранимую процедуру на любой временной основе, которую хотите очистить от любых отношений Родитель / Дочерний, где родитель или потомок не существует. Полоскать и повторять каждый раз, когда вы его запускаете, так как простое УДАЛЕНИЕ ИЗ родительского элемента WHERE NE (родительский) или NE (дочерний) не будет рекурсивным.

1 голос
/ 16 сентября 2009

Лучше всего использовать триггер после нескольких действий.

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