级联删除链接表,连接2个表,每个表都有一个级联删除到另一个表。怎么样?

时间:2011-02-14 21:34:29

标签: sql-server database-design foreign-keys cascade cascading-deletes

我正用这个把头发拉出来。我们假设以下对象为SQL中的表:

  • 公司
  • 员工(指公司)
  • 会议(也指公司)

员工可以参加会议,所以我们有一个链接表:

  • 员工会议(即员工和会议的FK)

此外,我无法触及公司表(例如,此处没有触发器)。我想拥有的是:

  1. 如果公司被移除,将删除所有员工
  2. 如果删除公司,则会删除所有会议
  3. 如果员工或会议被删除,则会删除所有EmployeeMeeting记录
  4. 不幸的是我被卡住了,因为这引发了可怕的“可能导致循环或多个级联路径”。考虑到约束,如何解决这个问题呢?我想我甚至不能把两个FK都放进去,或者有一个风险,即在删除公司之后,员工或会议都无法删除,因为EmployeeMeetings中的FK会阻止这一点。正确?

    彼得

2 个答案:

答案 0 :(得分:2)

如果我是你,我会完全避免触发器和级联删除。他们总是以意想不到的方式工作。

与触发器和级联删除相比,存储过程易于理解。因此,我将创建一个存储过程,在公司之前删除会议和员工:

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 :(得分:1)

从公司到员工,从公司到会议以及从员工到员工会议都有级联删除。 在删除EmployeeMeetings中删除的表会议后添加触发器。

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