2008-12-10 146 views
3

我有以下情况。主表和许多其他表与外键链接在一起。现在,当我想要删除主表中的一行时,会发生ConstraintsViolation,这是有意的,也是很好的。在SQL Server中删除之前可以检查约束吗?

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

这可能吗?

回答

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

确定这是一种有效的方法,但是如果稍后某人添加了链接到此表的其他表。然后这个代码必须改变。 – Drejc 2008-12-10 17:54:23

+0

哦,对于每个有主键的FK的表,你都需要其中的一个...如果该列表发生变化,那么是的,这个代码将不得不被修改,以为该另外的表添加额外的语句。 – 2008-12-10 18:07:53

1

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

0

一个丑陋的尝试将是在事务中尝试DELETE,如果成功则强制ROLLBACK。但这对我的口味来说很脏。

+0

他不是说他想在DELETE之前做检查吗? – FelixM 2009-11-27 21:02:18

0

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

首先,你需要确保你读过这些关系的状态后,没有人可以改变的,所以很明显,你需要使用事务和问题锁定行。

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

现在,在这个折磨之后,你真的看起来很贵吗?

0

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

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