删除父表和子表而不使用级联删除(SQL Server 2012或.net 4)

时间:2015-11-29 09:06:53

标签: c# sql-server smo

使用SQL Server 2012数据库,我需要实现一个功能,允许删除表中的行以及基于外键约束引用的所有子行。

鉴于Cascade delete是不可能的,因为我无法触及此数据库,是否有人在C#中编写了存储过程或某些代码,删除了父行及其所有孩子,无论这些孩子是多么深去用 他们的外键?

或者带有一些指针的链接/文章?

示例

表:

  1. 客户
  2. CustomerAddress
  3. CustomerAddress
  4. CustomerProducts
  5. ProductOrdered
  6. 如果我决定删除Id=1的客户,则应删除

    • 来自CustomerTable
    • 的一行
    • 来自CustomerAddress的所有行customerId=1
    • 属于customerProducts
    • 的所有CustomerId=1
    • 属于具有关联ProductOrdered
    • Customer的所有customerProductId

    基本上我们只知道根表Customer及其CustomerId(通用实现)。

    对任何不涉及第三方工具的建议开放。

    非常感谢任何建议

1 个答案:

答案 0 :(得分:2)

基本逻辑是首先从层次结构的底部(最深的嵌套)中删除,并在此过程中删除引用。

如果你正在使用这样的ORM。

foreach(var c in Customer)
{
    var caToClear = c.CustomerAddress().ToList();
    c.CustomerAddress.RemoveAll();
    foreach(var ca in c.caToClear)
    {
        ca.Delete();
    }

    var cpToClear = c.CustomerProducts.ToList();
    c.CustomerProducts.RemoveAll();
    foreach(var cp in cpToClear)
    {
        var poToClear = cp.ProductOrdered.ToList();
        cp.ProductOrdered.RemoveAll();
        foreach(var po in poToClear)
        {
            po.Delete();
        }
        cp.Delete();
    }
    c.Delete();
}

在SQL中执行相同的操作

DELETE FROM productordered 
WHERE  id IN (SELECT product_ordered_id 
              FROM   customerproducts 
              WHERE  customer_id = id_to_delete) 

DELETE FROM customeraddress 
WHERE  id IN (SELECT customer_address_id 
              FROM   customer 
              WHERE  customer_id = id_to_delete) 

DELETE FROM customer 
WHERE  id = id_to_delete