3

让我们假设以下对象是 SQL 中的表:

  • Companies
  • Employees(指公司)
  • Meetings(也指公司)

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

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

此外,我无法触摸 Companies 表(例如,对此没有触发器)。我想要的是:

  1. 如果公司被移除,所有员工都会被移除
  2. 如果公司被删除,所有会议都将被删除
  3. 如果员工或会议被删除,所有EmployeeMeeting记录都会被删除

不幸的是,我被困住了,因为这会引发可怕的“可能导致循环或多个级联路径”。鉴于限制,如何解决这个问题?我想我什至不能同时将两个 FK 都放入,否则存在删除公司后无法删除员工或会议的风险,因为 FKEmployeeMeetings会阻止这种情况发生。正确的?

4

2 回答 2

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

作为额外的好处,存储过程在您的数据库和应用程序之间创建了一个显式契约。

于 2011-02-14T21:50:58.700 回答
2

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

create trigger Meetings_Delete on Meetings after delete
as
begin
  set nocount on;
  delete EmployeeMeetings
  from deleted
  where deleted.MeetingsID = EmployeeMeetings.MeetingsID
end
于 2011-02-14T21:51:42.303 回答