SQL Server 2005 僅透過 object_id 追蹤相依性,基底物件必須先存在,且重命名/移動物件會中斷相依鏈。
CREATE/ALTER/DROP 時自動維護。| 物件 | 類型 | 用途 | 關鍵欄位 |
|---|---|---|---|
sys.sql_expression_dependencies |
系統檢視表 | 目前資料庫所有使用者定義物件的相依性記錄 (含延遲相依) | referencing_id, referenced_entity_name, referenced_class_desc, is_caller_dependent |
sys.dm_sql_referenced_entities |
動態管理函數 (TVF) | 傳入參考物件名稱,回傳其所參考的所有實體 (含欄位層級) | referenced_entity_name, referenced_minor_name (欄位), referenced_class_desc |
sys.dm_sql_referencing_entities |
動態管理函數 (TVF) | 傳入被參考物件名稱,回傳所有參考它的物件 | referencing_entity_name, referencing_class_desc |
-- 建立測試物件
CREATE TABLE dbo.SalesHistory (SaleID INT IDENTITY PRIMARY KEY, Product CHAR(150), SaleDate DATETIME, SalePrice MONEY);
GO
CREATE PROCEDURE dbo.usp_GetSales @Product VARCHAR(10) AS SELECT COUNT(SaleID), SUM(SalePrice) FROM dbo.SalesHistory;
GO
-- 1. 查詢 usp_GetSales 參考的所有實體 (含欄位)
SELECT referenced_entity_name, referenced_minor_name, referenced_class_desc
FROM sys.dm_sql_referenced_entities('dbo.usp_GetSales', 'OBJECT');
-- 結果: SalesHistory (OBJECT), SaleID/COLUMN, SalePrice/COLUMN ...
-- 2. 查詢參考 SalesHistory 的所有物件
SELECT referencing_entity_name, referencing_class_desc
FROM sys.dm_sql_referencing_entities('dbo.SalesHistory', 'OBJECT');
-- 結果: usp_GetSales (OBJECT)
-- 3. 系統檢視表查詢所有延遲相依 (參考不存在物件)
CREATE PROCEDURE usp_GetSalesFromArchive AS SELECT * FROM dbo.SalesHistoryArchive; -- 此表不存在
GO
SELECT referencing_id, referenced_entity_name FROM sys.sql_expression_dependencies
WHERE referenced_entity_name = 'SalesHistoryArchive';
-- 可找出所有參考已刪除/未建立物件的程式碼,利於清理技術債
sp_executesql、EXEC('...')) 內的參考**不會**被追蹤。WITH ENCRYPTION) 相依性不可見。