Sql 如何获取妨碍删除行I';我正试图删除

Sql 如何获取妨碍删除行I';我正试图删除,sql,sql-server,Sql,Sql Server,我有一个Sql Server数据库(2008R2,如果这很重要的话),其中有很多表。 有些表包含对其他表的外键引用,有些外键约束在删除时具有级联,有些是限制删除 为了便于用户使用,在我的应用程序中,我想找出需要删除的所有其他引用,然后才能删除当前正在删除的引用并将其呈现给用户。 下面介绍了一些常见问题: 我尝试从Id=1且订单具有客户外键的客户中删除(该外键在删除订单之前限制用户删除客户),我希望获得所有限制我删除客户的订单的结果 如果合同也有对客户的引用,并且外键是级联的,但是合同被限制删除的

我有一个Sql Server数据库(2008R2,如果这很重要的话),其中有很多表。 有些表包含对其他表的外键引用,有些外键约束在删除时具有级联,有些是限制删除

为了便于用户使用,在我的应用程序中,我想找出需要删除的所有其他引用,然后才能删除当前正在删除的引用并将其呈现给用户。 下面介绍了一些常见问题:

  • 我尝试从Id=1且订单具有客户外键的客户中删除(该外键在删除订单之前限制用户删除客户),我希望获得所有限制我删除客户的订单的结果

  • 如果合同也有对客户的引用,并且外键是级联的,但是合同被限制删除的报警引用,我想得到哪个合同负责不能删除客户,以及负责不能删除客户的报警

  • 我希望这种行为是递归的,这样我就可以得到所有的连接,直接的或间接的,这些连接首先会阻止我删除Customer。我还希望无论从哪里开始都能获得此信息(无论我是否要删除客户、订单、警报等)

  • 在我之前似乎有人遇到过类似的问题,但我可以找到获取表->表外键限制的信息,而不是与数据库中的特定实体(即Id=1的客户)相关的信息


    有什么简单的方法可以做到这一点吗?

    基本上,我将其视为数据库/应用程序体系结构的一部分,作为开发人员或DBA,您需要知道如何连接表

    您需要使用客户ID并对任何使用customerID作为外键的表进行查询,这将为您提供一个结果。合同也是如此。您可以使用一些ERD工具来实现这一点,但我倾向于为我的数据库创建自己的类来实现这一点,这样我就可以完全控制我想要做的事情。例如,在客户的delete方法中,公司可能只想为客户禁用或将active设置为false。或者真正删除所有内容


    有一种方法可以在数据库中级联删除,但我不确定您是否要这样做,因为您要求返回一个结果。

    我知道没有内置任何内容。在任何适当大小的数据库中,计算所有FK引用的传递闭包可能会非常昂贵。这就是服务器遇到第一个障碍时立即放弃的原因。这正是您不应该做的。您永远不应该只是自动删除行。您应该始终与这些行保持已知的关系,并在知情的情况下决定是否删除这些行。你,程序员,不是用户,当然也不是程序。如果一行应该阻止主行被删除,那么一个“弄清楚它并执行它”将绕过该行。此外,要删除其他行,您可能必须删除其他行、其他位置等。我的建议是:不要这样做!如果数据库设计正确,则应该可以仅获取与要删除的实体的直接关系。也就是说,如果您因为该客户下的订单而无法删除该客户,那么这应该是一个“足够友好”的理由,可以发送回该客户,而无需详细说明。@EmmadCareem这可能还可以,但对于我们(我们的传统产品),我们的表结构具有高达7+的依赖深度。当然,用户会得到需要删除订单的信息,但当用户试图删除订单时,他会得到需要先删除其他内容的信息,当用户试图删除订单时,他。。。。。。获取有关需要删除的内容的详细信息。不,没有任何简单的方法。我们不希望对所有内容都使用级联删除。有些东西可以级联,但有些东西我们需要获得用户输入,因为用户可能不知道删除某些东西的后果。但我们不想让用户白费力气,尝试删除客户->获取订单错误->尝试删除订单->获取订单连接到其他地方的错误…然后我建议设置一个类,该类将返回一个数据集,您可以将此信息显示给用户。问题是不向用户显示信息,我会弄清楚。问题是首先要找到信息。当您试图删除SQL中的某些内容时,您将收到第一个错误,而不是整个依赖关系结构。我希望用户在尝试删除特定实体时能够看到整个依赖关系图。