【问题标题】:Delete Parent and child tables without using cascade delete (SQL Server 2012 or .net 4)在不使用级联删除的情况下删除父表和子表(SQL Server 2012 或 .net 4)
【发布时间】:2015-11-29 09:06:52
【问题描述】:

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

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

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

示例

表格:

  1. 客户
  2. 客户地址
  3. 客户地址
  4. 客户产品
  5. ProductOrdered

如果我决定删除Id=1 的客户,它应该删除

  • CustomerTable 中的一行
  • CustomerAddress 中带有customerId=1 的所有行
  • 属于CustomerId=1的所有customerProducts
  • 属于 Customer 的所有 ProductOrdered 以及关联的 customerProductId

基本上我们只知道根表Customer,它是CustomerId(通用实现)。

欢迎任何不涉及第三方工具的建议。

非常感谢您的任何建议

【问题讨论】:

  • 您是否正在使用您不知道其架构的数据库?从开发人员的角度来看,这没有任何意义
  • 您可以使用来自 sql server 的元数据来生成查询或使用 SMO 在 C# 中构建它。但正如斯塔夫所说,这没有任何意义。您绕过所有业务规则,只是假设可以删除某些内容?如果你甚至不知道架构,你怎么知道它没关系?
  • @Steve,我知道架构,但我不拥有数据库,它是一个客户端数据库。我也不确定是否反对。我认为你对它的阅读比你应该阅读的更多。我没有想详细解释一下,因为不可读,没有人回复。我尽量简洁。

标签: c# sql-server smo


【解决方案1】:

基本逻辑是先从层次结构的底部(嵌套最深)移除,沿途移除引用。

如果您正在使用类似这样的 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 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多