使用FK查找数据库中两列之间的最短路径

时间:2014-11-14 08:54:26

标签: sql-server tsql sql-server-2008-r2

我目前正在开展数据图非常混乱的项目。例如,如果您想要找到要应用合同的区域,而不是仅仅 在合同表中为该地区拥有FK,您将只有一个负责监督合同的机构的FK,然后从该表中您将链接到 负责与该机构打交道的贵公司部门,然后从该部门转移到业务单位ID,然后从业务单位表转移 你最终会找到你感兴趣的地区的FK。

这是一个真正的痛苦,因为除此之外,业务逻辑在数据库中实现,并且它是一个非常复杂的行业。 因此,在开发时,我们正在处理两个复杂问题:查找数据和理解业务逻辑。

了解数据图实际上需要非常了解域。我知道并且我同意每个开发人员都应该了解他所在的域名, 但在这里,这是一项非常艰巨的任务。我们谈论的是受监管的行业,有很多具体的规则。

通过我给出的例子,你可以看到,即使你在工作 在合同创建模块中,你不能只说:嗯,我会继续深入研究该部分的领域,因为在寻找该地区时,你最终需要知道你会在数据图的另一部分找到它。 它只是一个例子,真正的实体远没有那么直观。

我昨天有个主意。因为在SQL Server中我们可以访问所有数据库的模式,所以我想编写一个带有2个参数的脚本:

- 表StartPoint的名称 - 我们追求的列名。

它将返回一个"图表"所有可以访问它的路径。

这是一件容易的事吗,你会怎么做呢? (我不是SQL Server专家)

1 个答案:

答案 0 :(得分:1)

对我来说这是一个相当大的任务,但如果使用sys.foreign_keys和sys.foreign_key_columns创建递归CTE,则可以完成此任务。我认为这篇文章Traverse through all foreign keys in database and generate a path或者这个帖子https://social.msdn.microsoft.com/Forums/sqlserver/en-US/66f379e1-32bc-44cb-bb48-93f42993ba23/is-there-a-way-to-determine-the-order-in-which-you-need-to-perform-deletes-when-there-using-a?forum=transactsql与我想象的很接近,然后只应用WHERE过滤器。