我可以在SQL Server中删除之前检查约束吗?

时间:2008-12-10 17:42:24

标签: sql database sql-server-2005 constraints

我有以下情况。主表和许多其他表与外键链接在一起。现在,当我想删除主表中的一行时,会发生ConstraintsViolation,这是有意义的。

现在我希望能够在触发删除行事件之前检查是否会发生ConstraintsViolation。

这可能吗?

5 个答案:

答案 0 :(得分:1)

If Exists ( Select * From OtherTable
            Where OtherTableFKColumn = MainTablePrimaryKey) 
   Begin
       Rollback Transaction
       RaisError('Violating FK Constraint in Table [OtherTable]', 16, 1)
   End

答案 1 :(得分:1)

除了检查每个相关表格的COUNT(*)之外?我不这么认为。

答案 2 :(得分:0)

一个丑陋的尝试是在事务中尝试DELETE,然后在成功时强制执行ROLLBACK。但这对我来说很脏。

答案 3 :(得分:0)

这是一个表面看起来不错但有影响的问题。

首先,您需要确保在阅读完这些关系的状态后,没有人可以更改这些关系,因此显然您需要使用事务并锁定相关行。

然后你需要一种方法来弄清楚要检查的关系,正如我在评论中看到的那样,如果有人后来添加新关系会发生什么。因此,您需要查询模式,或者可能从模式中自动生成此代码,以便每次更改模式时都只需要运行检测机制。

现在,在这次考验之后你得到的例外真的看起来很贵吗?

答案 4 :(得分:0)

我认为尝试这样的事情并不是一个好主意,因为这意味着必须对每个外键进行两次检查:事先由您执行一次,然后在执行SQL时由服务器再次检查。性能影响可能很严重。

但是,如果你有这样的想法,最通用的方法是使用数据库的数据字典。我不熟悉SQL Server数据字典,但其他关系数据库将所有元数据存储在您可以查询的数据库表中。您可以找到引用表的所有外键,并动态构建查找依赖行的查询。