sql-server - 级联删除链接表连接 2 个表,每个表都有一个级联删除到另一个表。如何?

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

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

  • 公司
  • Employees(指公司)
  • session (也指公司)

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

  • EmployeeMeetings(即 FK 给员工和 session )

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

  1. 如果一家公司被撤职,所有员工也将被撤职
  2. 如果公司被移除,所有 session 也将被移除
  3. 如果删除员工或 session ,所有 EmployeeMeeting 记录都将被删除

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

最佳答案

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

与触发器和级联删除相比,存储过程更容易理解。所以我会创建一个存储过程,在公司之前删除 session 和员工:

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

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

关于sql-server - 级联删除链接表连接 2 个表,每个表都有一个级联删除到另一个表。如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4997535/

相关文章:

sql - 执行表更改脚本删除 Azure SQL 表

sql - 如何编写SQL来级联累加行数据?

c# - Entity Framework 到远程服务器(连接字符串)

mysql - 如何在 MySQL 中使用别名对城市建模

sql-server - 将 Char PK/FK 转换为 Varchar 或 RTRIM?

sql - 返回范围内每个日期的一列

sql-server - 将地址表链接到多个其他表

php - 从多个表中获取数据的最佳方式

sql - 如何解决 'Foreign key constraint is incorrectly formed'问题

sql - 多个外键作为主键 postgres,我应该这样做吗?