2013-02-19 63 views

回答

2

SQL服务器(或竞争产品)中没有任何内容会告诉你哪个特定的表和行导致冲突。该错误消息只会告知要检查哪个FK。

根据the answer that JLo gave,你可以在你自己的[在删除之前]触发你的表格,这些表格将沿着每个FK表遍历并计数相关记录。如果你正在使用SP,你可以使用try/catch块来做同样的事情。

你有我的同情心,因为这样的事情写起来会很乏味。如果你为此做了几个表,我建议使用代码生成器(T4 toolkit或MyGeneration)为你生成这些表。

1

这将为您提供特定表的外键。你必须自己检查每个配对。

SELECT 
    f.name as [Foreign Key], 
    OBJECT_NAME(f.parent_object_id) as [Table], 
    COL_NAME(fc.parent_object_id, fc.parent_column_id) as [Column], 
    OBJECT_NAME(f.referenced_object_id) as [Reference Table], 
    COL_NAME(fc.referenced_object_id, fc.referenced_column_id) as [Reference Column] 
FROM sys.foreign_keys f 
JOIN sys.foreign_key_columns fc 
    ON fc.constraint_object_id = f.object_id 
WHERE fc.parent_object_id = OBJECT_ID(N'[dbo].[Document]') 

这应该让你开始......祝你好运!

+0

谢谢。我已经有了关系 - 它包含在错误信息中。该查询对于显示关系仍然很有用。 – 2013-02-19 14:30:23

+0

如果它已显示在错误消息中,为什么要问如何显示它?我可能错过了 – 2013-02-19 14:38:39

+0

这个问题的要点,我正在寻找要显示的冲突行的主键。例如 - TableA中的Id 123正被TableB引用。 – 2013-02-19 14:40:46

0

它受到限制的值是您试图删除的值之一,所以前例。

delete from tableA where value = 123 

将抛出一个约束错误,如果有符合的123值的另一个表的外键约束的地方......这就是为什么正确命名你的约束是重要的,但如果没有,你总是可以运行Ĵ LO的脚本来找出哪些约束可用。

在类似

delete from tableA where value IN (select top 10 * from tableA) 

更复杂的更改删除成SELECT * FROM和交叉引用使用类似于上述的陈述这些值......你也可以直接运行我的子查询,但它是只是一个例子。