2015-05-05 65 views
2

儘管有許多外鍵,但我們有一個傳統的SQLServer數據庫,但有很少的指定外鍵約束。有沒有辦法使用服務器日誌來識別未指定的外鍵?識別沒有約束的外鍵關係

+0

如果沒有定義約束,並假定列引用另一個表中的一列(假想的外鍵)恐怕你的運氣不好我的朋友。 –

回答

0

如果沒有指定外鍵約束,那麼你擁有的只是表的集合,服務器日誌不會告訴你任何東西。

您將可以從數據庫中獲得一些線索,例如外鍵可能相當明顯,即OrderDetails表上的PartID。您可能能夠檢查視圖,存儲過程和其他服務器代碼來查找JOIN,但並非所有這些都會指示FK。如果系統處於活動狀態,那麼您也可以在針對數據庫運行的查詢中使用相同的連接。

一旦你確定,你可以看到,如果所有的匹配使用全外的值加入一些像這樣的潛在FKS:

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,如果它返回幾個,那麼你可能仍然有一個有幾個錯過刪除等

+0

這基本上就是我們正在做的,分析查詢並尋找明顯的問題。我只是希望有某種工具可以自動識別它們。這當然是一個可以解決的問題,但它看起來並不像目前有一種工具可以乾淨利落。 –

+0

你可能想看看我的http://stackoverflow.com/questions/29023514/how-can-i-get-a-list-of-all-columns-referenced-in-a-stored-procedure/30002523# 30002523並查看您是否可以在緩存的xml查詢計劃中找到連接而不是列。 –