【问题标题】:How to detect if an entity is in use in SQL Server 2008?如何检测实体是否在 SQL Server 2008 中使用?
【发布时间】:2012-12-13 00:30:57
【问题描述】:

我想知道有什么方法可以知道一条记录是否正在与其他记录一起使用。

除了捕获引用完整性异常之外,还有其他方法可以找到它吗?

我通常会捕捉到这个异常并告诉用户不要删除或无法删除记录。

【问题讨论】:

  • 您的 CRUD 操作使用什么样的技术/框架?您的应用程序对系统表有什么类型的访问权限?
  • @MichaelPerrenoud : Linq2Sql
  • @DaveMarkle - 这个问题与并发无关。

标签: c# asp.net sql-server sql-server-2008 tsql


【解决方案1】:

您可以对相关表运行查询。

【讨论】:

  • 如果我的记录分散到 10-15 个表中会怎样。我不想针对每张桌子写它。我想要一些通用的方法来识别
  • 如果记录是从其他表中引用的,您可以添加一个新列来存储预先计算的值。您可以在更新引用时更新此列的值,因此您不必在每次读取时都运行繁重的查询。
  • 你的意思是添加一个像 IsInUse 这样的列来跟踪它的使用情况。但问题再次出现在它的回溯上。在这种情况下,每次删除引用表中的记录时,我都必须回溯该删除记录中的每条记录,这又是一种矫枉过正。
  • 这不是矫枉过正,这是您的要求。您想知道是否从其他表中引用了该记录而不依赖于异常。我给你答案:查询其他表。如果您不想支付多次查询的代价,则可以将结果缓存在单独的列中。您可以将其存储为一个数字,并在添加关系时增加它,并在删除它时减少它。如果值为 0,则表明该记录没有任何关系。
  • 存储外键和约束的系统表怎么样。我没有表名,也没有可用于访问数据的 SP。但是 SQL DBA 会知道
【解决方案2】:

创建一个使用系统表中的 FK 为每个表构建自定义视图的存储过程。在每个视图中,查询所有相关表。每次添加或删除 FK 时运行 SP,以便它适当地更新所有视图。

问题解决了。

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多