0

我正在使用包含近850个表的SQL Server数据库。它有很多已定义的关系和大量未定义的关系(FK),未定义的主键等。这是一团糟。我无法访问应用程序源代码,因此我无法通过代码追踪未定义的关系。SQL Server数据库中的未定义关系(外键)

是否有任何软件或查询由我只能看数据,并计算出表之间的关系?更具体地说,每个表中的每个字段(列)都映射(加入)所有其他表的每一列,并为我提供某种类型的报告。将近60%的情况下,列名在相关表中将类似,但许多表具有相同的主键名称(例如item_id)。

我需要它正在每天苦不堪言我一生所有这些不确定的关系! :(

+0

同意当前2和(可能)所有后续答复。这是一个“精灵”问题:一旦你让精灵脱离瓶子(没有陈述性的参照完整性),它很难将它拿回瓶中。 – 2012-02-16 19:51:09

回答

2

我认为最好的方法是使用Profiler来捕获正在执行的语句,并尝试推断的关系。这是一个艰难的一个,并没有任何简单的解决方案,我所知道!的

好运

+0

这是一个由许多开发人员组织处理的巨大应用程序。我认为需要一年时间才能完成应用程序中的所有按钮的点击。我已经尝试了剖析器并找出了一些链接,但大多数情况下我甚至无法确定哪个应用程序页面与特定数据库表关联。无论如何,我可以在不向所有表写入触发器的情况下获得在数据库中执行的所有DML查询? – 2012-02-17 15:09:42

1

好了,你可以查询元数据 - INFORMATION_SCHEMA.COLUMNS - 过滤掉东西是不大可能加入成为关键 - 就像TEXT/NVARCHAR(MAX),把它放在某种。数据字典表,你开始与信息标记列

您可以用之类的东西查询:

SELECT * 
FROM INFORMATION_SCHEMA.COLUMNS AS C 
INNER JOIN INFORMATION_SCHEMA.TABLES AS T 
    ON C.COLUMN_NAME = T.TABLE_NAME + '_ID'; 

看看是否有明显的匹配。

这可能会帮助你的数据库的处理。但这需要很多工作。

如果没有外键约束,甚至有可能他们已经完成了诸如“多键”之类的事情,其中​​某个列是某个表或另一个表的外键(取决于某种类型的选择器)可能有外键约束) - 有可能你甚至不会在分析器中看到这一点,除非在单独的连接之间 - 所以有一次你可能会看到它连接到一个表,有时甚至是另一个表。

+0

谢谢凯德。我已经尝试了所有可以与列名匹配的东西,并找出了我可以达到的最大关系。但我想把数据带入画面。例如Table a内部连接a.product_id(int)= b.item_id(varchar(10))上的表B,列名是不同的,但数据很陌生。我想要加入一列与850表中的所有列并为数据库中的所有列做这些工作。是否有任何简单的方法,我可以使用某种工具来做到这一点 – 2012-02-17 15:16:20

+0

@need_the_buzz你当然可以编码生成所有类似数据类型字段的比较,并获得每一侧的计数和计数匹配,但没有我知道的工具。 – 2012-02-17 16:11:43