瞭解 SQL 相依性
新增: 2005 年 12 月 5 日
SQL 相依性是 SQL 運算式中使用的依名稱 (by-name) 參考,可以讓一種物件相依於另一個物件。您可以透過查詢 sys.sql_dependencies 目錄檢視來尋找所有的依名稱參考。在 sys.sql_dependencies 的每個資料列中,受參考的實體 (referenced_major_id) 將依名稱顯示在參考物件的保存 SQL 運算式中。
下圖顯示 SQL 相依性的範例。
圖中有兩個物件:程序 X 和程序 Y。程序 X 包含的 SQL 運算式具有程序 Y 的依名稱參考。程序 X 稱為參考物件或相依物件,而程序 Y 則稱為受參考物件或獨立物件。由於程序 X 相依於程序 Y,因此如果程序 Y 不存在,程序 X 就會因為執行階段錯誤而失敗。不過,如果程序 X 不存在,程序 Y 並不會失敗。
下列範例顯示預存程序 X
如何相依於預存程序 Y
。
USE tempdb
GO
CREATE PROCEDURE Y AS
SELECT * FROM sys.objects
GO
CREATE PROCEDURE X as
EXEC Y
GO
若要查看 X
對 Y
的相依性,請執行下列查詢。
SELECT *
FROM sys.sql_dependencies
WHERE object_id = object_id('X')
AND referenced_major_id = object_id('Y')
AND referenced_minor_id = 0
AND class = 0;
GO
如果卸除程序 X
,您還是可以執行程序 Y
。程序 Y
獨立於程序 X
。相反地,如果卸除程序 Y
,並嘗試執行程序 X
,SQL Server 便會傳回執行階段錯誤。程序 X
相依於程序 Y
。
卸除程序 Y
之後,sys.sql_dependencies 目錄檢視中程序 X
的資料列也會一併卸除。若要觀察這種行為,請執行下列程式碼。
USE tempdb;
GO
DROP PROCEDURE Y;
GO
SELECT *
FROM sys.sql_dependencies
WHERE object_id = object_id('X')
AND referenced_major_id = object_id('Y')
AND referenced_minor_id = 0
AND class = 0;
GO
您可以使用 WITH SCHEMABINDING 子句來強制維護相依性。如果您結構描述繫結檢視,就不能以會破壞相依性的方法來修改或卸除受參考的資料表或資料行。同樣地,如果您結構描述繫結函數,就不能以會破壞函數相依性的方法來修改或卸除受參考的物件和資料行。如需有關結構描述繫結的詳細資訊,請參閱<建立使用者自訂函數 (Database Engine)>和<設計和實作檢視>。
附註: |
---|
SQL Server 2005 不支援結構描述繫結的預存程序或觸發程序。 |
SQL 相依性範例
下表列出參考物件與受參考物件之間可能存在之 SQL 相依性的部份範例。
參考物件的類型
目錄檢視定義資料行中的 SQL 運算式
受參考實體範例
程序、函數、檢視、觸發程序
sys.sql_modules
附註:
如果是伺服器層級的觸發程序,請參閱 sys.server_sql_modules
資料表、程序、類型
計算資料行
sys.computed_columns
函數、類型、其他資料行
DEFAULT 定義
sys.default_constraints
函數
CHECK 條件約束
sys.check_constraints
函數、資料分割函數
編號程序
sys.numbered_procedure
資料表、程序、類型
結構描述繫結的函數
sys.sql_modules
XML 結構描述集合
非 SQL 相依性範例
存在物件之間的相依性不一定全都是 SQL 相依性。如果物件中沒有包含另一個物件之依名稱參考的 SQL 運算式,這兩個物件之間就沒有 SQL 相依性。下表列出非 SQL 相依性的部份範例。
參考物件的類型 | 相依於 | 描述 |
---|---|---|
資料行 |
資料表 |
資料表及其資料行之間的相依性並不明確。這種關聯性在系統目錄中是以外部索引鍵 sys.columns.object_id 來表示。 |
資料行上的 DEFAULT 定義,例如:
|
資料行。在此範例中,即為 |
因為預設的 |
請參閱
其他資源
sys.sql_dependencies (Transact-SQL)
sys.sysdepends (Transact-SQL)
sp_depends (Transact-SQL)