Каскадное удаление в связанной таблице объединяет 2 таблицы, каждая из которых имеет каскадное удаление в другую таблицу.Как? - PullRequest
2 голосов
/ 15 февраля 2011

Я вытаскиваю свои волосы с этим. Предположим, что следующие объекты в виде таблиц в SQL:

  • Компании
  • Сотрудники (относится к компаниям)
  • Встречи (также относится к компаниям)

И сотрудники могут быть на собраниях, поэтому у нас есть таблица ссылок:

  • Встречи сотрудников (т. Е. FK для сотрудников и собраний)

Кроме того, я не могу дотронуться до таблицы Companies (например, нет триггеров для этого). То, что я хотел бы иметь, это:

  1. Все сотрудники будут удалены, если компания будет удалена
  2. Все собрания удаляются, если удаляется компания
  3. Все записи EmployeeMeeting удаляются, если удаляется либо сотрудник, либо собрание

К сожалению, я застрял, так как это вызывает ужас, «может вызвать циклы или несколько каскадных путей». Как можно обойти это, учитывая ограничения? Я полагаю, что я не могу даже вставить оба FK, или есть риск, что после удаления компании ни сотрудник, ни собрание не могут быть удалены, поскольку FK в EmployeeMeetings предотвратит это. Верно?

Peter

Ответы [ 2 ]

2 голосов
/ 15 февраля 2011

На вашем месте я бы избегал триггеров и каскадных удалений вообще. Они всегда работают неожиданным образом.

Хранимые процедуры просты для понимания по сравнению с триггерами и каскадным удалением. Поэтому я бы создал хранимую процедуру, которая удаляет собрания и сотрудников перед компанией:

create procedure dbo.RemoveCompany(@companyId int)
as
delete * from employees where CompanyId = @companyId
delete * from meetings where CompanyId = @companyId
delete * from companies where Id = @companyId

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

1 голос
/ 15 февраля 2011

иметь каскадное удаление из компаний для сотрудников, из компаний на собрания и из сотрудников в встречи сотрудников. Добавьте триггер после удаления в таблице Meetings, который удаляется в EmployeeMeetings.

create trigger Meetings_Delete on Meetings after delete
as
begin
  set nocount on;
  delete EmployeeMeetings
  from deleted
  where deleted.MeetingsID = EmployeeMeetings.MeetingsID
end
...