我有以下情况。主表和许多其他表与外键链接在一起。现在,当我想删除主表中的一行时,会发生ConstraintsViolation,这是有意义的。
现在我希望能够在触发删除行事件之前检查是否会发生ConstraintsViolation。
这可能吗?
答案 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数据字典,但其他关系数据库将所有元数据存储在您可以查询的数据库表中。您可以找到引用表的所有外键,并动态构建查找依赖行的查询。