首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 2008 物件相依性追蹤新功能:sys.sql_expression_dependencies 與 DMF 完整解析

     編輯:關於SqlServer

舊版痛點

SQL Server 2005 僅透過 object_id 追蹤相依性,基底物件必須先存在,且重命名/移動物件會中斷相依鏈。

SQL Server 2008 重大改進:以名稱為基礎的相依性追蹤

  • 支援**延遲相依性**:基底物件尚未建立時即可記錄相依 (如預存程序參考未來將建立的資料表)。
  • 跨資料庫 (三部件名稱) 與跨伺服器 (四部件名稱/連結伺服器) 均支援。
  • 相依性在 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';
-- 可找出所有參考已刪除/未建立物件的程式碼,利於清理技術債

應用場景

  • 影響分析:修改資料表結構前,查詢所有參考該表的預存程序/檢視/函數。
  • 廢棄物件清理:尋找參考已不存在物件的程式碼 (延遲相依)。
  • 文件自動產生:產生物件相依關係圖 (Graphviz/D3.js 視覺化)。
  • 部署驗證:部署腳本前檢查所有相依物件是否已存在。

注意事項

  • 動態 SQL (sp_executesql、EXEC('...')) 內的參考**不會**被追蹤。
  • 加密物件 (WITH ENCRYPTION) 相依性不可見。
  • 資料庫相容性層級需 ≥ 100 (SQL 2008) 才啟用完整功能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved