【问题标题】:Identify foreign key relationships without contstraints识别无约束的外键关系
【发布时间】:2015-05-08 04:25:15
【问题描述】:

我们有一个旧的 SQLServer 数据库,它几乎没有指定的外键约束,即使有很多外键。有没有办法使用服务器日志来识别未指定的外键?

【问题讨论】:

  • 如果没有定义约束并且假设一个列正在引用另一个表中的一个列(想象中的外键)我恐怕你不走运我的朋友。

标签: sql-server foreign-keys


【解决方案1】:

如果未指定外键约束,那么您所拥有的只是一组表,服务器日志不会告诉您任何信息。

您所能做的就是从数据库中获取一些线索,例如外键可能相当明显,即 OrderDetails 表上的 PartID。您可能能够检查视图、存储过程和其他服务器代码以找到 JOIN,尽管并非所有这些都表示 FK。如果系统处于活动状态,那么您还可以针对数据库运行查询以获取相同的连接。

一旦您确定了一些潜在的 FK,您就可以使用这样的完整外连接查看这些值是否全部匹配:

SELECT * 
FROM Table_1 AS t1
LEFT OUTER JOIN Table_2 AS t2
ON t1.CandidateID = t2.CandidateID
WHERE t1.CandidateID IS NULL OR t2.t1.CandidateID IS NULL

如果表有数据并且这不返回任何行,那么您可能有一个 FK,如果它返回一些,那么您可能仍然有一个带有一些丢失删除等的 FK。

【讨论】:

  • 这基本上就是我们正在做的,分析查询并寻找明显的查询。我只是希望有某种工具可以自动识别它们。这当然是一个可以解决的问题,但看起来目前还没有一个工具可以干净地完成它。
  • 您可能想查看我的stackoverflow.com/questions/29023514/…,看看您是否可以在缓存的 xml 查询计划中找到联接而不是列。
猜你喜欢
  • 2020-03-17
  • 1970-01-01
  • 2019-03-27
  • 2013-06-29
  • 2019-09-29
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
  • 1970-01-01
相关资源
最近更新 更多