【发布时间】:2015-05-08 04:25:15
【问题描述】:
我们有一个旧的 SQLServer 数据库,它几乎没有指定的外键约束,即使有很多外键。有没有办法使用服务器日志来识别未指定的外键?
【问题讨论】:
-
如果没有定义约束并且假设一个列正在引用另一个表中的一个列(想象中的外键)我恐怕你不走运我的朋友。
我们有一个旧的 SQLServer 数据库,它几乎没有指定的外键约束,即使有很多外键。有没有办法使用服务器日志来识别未指定的外键?
【问题讨论】:
如果未指定外键约束,那么您所拥有的只是一组表,服务器日志不会告诉您任何信息。
您所能做的就是从数据库中获取一些线索,例如外键可能相当明显,即 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。
【讨论】: