嵌套SQL Server事务执行级联删除

时间:2020-03-05 18:52:11  来源:igfitidea点击:

假设我有一个名为Companies的表,该表具有DepartmentID列。还有一个Departaments表,其表为EmployeeID列。当然,我也有一个Employee表。问题是我想删除公司,所以首先我必须删除每个部门的所有员工,然后是公司中的所有部门。
级联删除不是一种选择,因此我希望使用嵌套事务。我是SQL的新手,所以感谢帮助。

解决方案

回答

我没有回答问题,但是外键是要走的路,为什么没有选择呢?

至于嵌套事务,它们是:

BEGIN
  delete from Employee where departmentId = 1;
  BEGIN
     delete from Department where companyId = 2;
     BEGIN
        delete from Company where companyId = 2;
     END
  END
END

以编程方式,当然看起来有所不同,但这取决于我们使用的平台

回答

我不确定为什么在这里需要嵌套事务。我们只需要进行一次实际交易:

BEGIN TRAN

DELETE FROM Employee
    FROM Employee
    INNER JOIN Department ON Employee.DepartmentID = Department.DepartmentID
    INNER JOIN Company ON Department.CompanyID = Company.CompanyID
    WHERE Company.CompanyID = @CompanyID

DELETE FROM Department
    FROM Department
    INNER JOIN Company ON Department.CompanyID = Company.CompanyID
    WHERE Company.CompanyID = @CompanyID

DELETE FROM Company
    WHERE Company.CompanyID = @CompanyID

COMMIT TRAN

请注意双精度FROM,不是错字,它是在DELETE中执行JOIN的正确SQL语法。

每个语句都是原子的,整个DELETE是成功还是失败,在这种情况下并不重要,因为整个批处理都会成功或者失败。

BTWI认为关系倒退了。部门将没有EmployeeID,雇员将具有DepartmentID。