sys.sql_expression_dependencies (Transact-SQL)
針對在目前資料庫中使用者自訂實體的每個依據名稱相依性,各包含一個資料列。 兩個實體之間的相依性是在某個實體 (稱為「受參考的實體」(Referenced Entity)) 依據名稱顯示於另一個實體 (稱為「參考實體」(Referencing Entity)) 的保存 SQL 運算式時建立。 例如,在某個檢視的定義中參考資料表時,該檢視 (參考實體) 就會相依於資料表 (受參考的實體)。 如果資料表遭卸除,檢視便無法使用。
您可以使用這個目錄檢視來報告下列實體的相依性資訊:
結構描述繫結的實體。
非結構描述繫結的實體。
跨資料庫與跨伺服器的實體。 雖然系統會報告實體名稱,但是不會解析實體識別碼。
結構描述繫結實體的資料行層級相依性。 您可以使用 sys.dm_sql_referenced_entities 來傳回非結構描述繫結物件的資料行層級相依性。
伺服器層級 DDL 觸發程序 (在 master 資料庫的內容時)。
適用於:SQL Server (SQL Server 2008 至目前版本)。 |
資料行名稱 |
資料類型 |
描述 |
---|---|---|
referencing_id |
int |
參考實體的識別碼。 不可為 Null。 |
referencing_minor_id |
int |
當參考實體是資料行時,就是資料行識別碼,否則便是 0。 不可為 Null。 |
referencing_class |
tinyint |
參考實體的類別。 1 = 物件或資料行 12 = 資料庫 DDL 觸發程序 13 = 伺服器 DDL 觸發程序 不可為 Null。 |
referencing_class_desc |
nvarchar(60) |
參考實體之類別的描述。 OBJECT_OR_COLUMN DATABASE_DDL_TRIGGER SERVER_DDL_TRIGGER 不可為 Null。 |
is_schema_bound_reference |
bit |
1 = 受參考的實體是結構描述繫結。 0 = 受參考的實體非結構描述繫結。 不可為 Null。 |
referenced_class |
tinyint |
受參考實體的類別。 1 = 物件或資料行 6 = 類型 10 = XML 結構描述集合 21 = 資料分割函數 不可為 Null。 |
referenced_class_desc |
nvarchar(60) |
受參考實體之類別的描述。 OBJECT_OR_COLUMN TYPE XML_SCHEMA_COLLECTION PARTITION_FUNCTION 不可為 Null。 |
referenced_server_name |
sysname |
受參考實體之伺服器的名稱。 這個資料行會因透過指定有效的四部分名稱所達成的跨伺服器相依性而擴展。 如需有關多部分名稱的詳細資訊,請參閱<Transact-SQL 語法慣例 (Transact-SQL)>。 若為參考了實體的非結構描述繫結實體,但沒有指定四部分名稱,則為 NULL。 若為結構描述繫結的實體,則為 NULL;因為它們必須位於相同的資料庫中,因此只能使用兩部分 (schema.object) 名稱加以定義。 |
referenced_database_name |
sysname |
受參考實體之資料庫的名稱。 這個資料行會因透過指定有效的三部分或四部分名稱所達成的跨資料庫或跨伺服器參考而擴展。 在使用一部分或兩部分名稱指定時,若為非結構描述繫結參考,則為 NULL。 若為結構描述繫結的實體,則為 NULL;因為它們必須位於相同的資料庫中,因此只能使用兩部分 (schema.object) 名稱加以定義。 |
referenced_schema_name |
sysname |
受參考實體所屬的結構描述。 若為參考了實體的非結構描述繫結參考,但沒有指定結構描述名稱,則為 NULL。 若為結構描述繫結的參考,則永遠不會是 NULL;因為您必須使用兩部分名稱來定義和參考結構描述繫結的實體。 |
referenced_entity_name |
sysname |
受參考實體的名稱。 不可為 Null。 |
referenced_id |
int |
受參考實體的識別碼。 若為跨伺服器與跨資料庫的參考,則一律是 NULL。 無法判斷識別碼時,若為資料庫中的參考,則為 NULL。 若為非結構描述繫結參考,便無法在下列情況中解析識別碼:
若為結構描述繫結的參考,則永遠不會是 NULL。 |
referenced_minor_id |
int |
當參考實體是資料行時,就是受參考資料行的識別碼,否則便是 0。 不可設為 Null。 當資料行在參考實體中由名稱所識別,或者父實體用於 SELECT * 陳述式時,受參考的實體就是資料行。 |
is_caller_dependent |
bit |
指出在執行階段發生之受參考實體的結構描述繫結。因此,實體識別碼的解析會相依於呼叫端的結構描述。 當受參考的實體為預存程序、擴充預存程序,或在 EXECUTE 陳述式內部呼叫的非結構描述繫結使用者定義函數時,就會發生這個事件。 1 = 受參考的實體是呼叫端相依,而且在執行階段解析。 在此情況下,referenced_id 會是 0。 0 = 受參考的實體識別碼不是呼叫端相依。 若為結構描述繫結參考,以及明確指定結構描述名稱的跨資料庫和跨伺服器參考,則一律是 0。 例如,採用 EXEC MyDatabase.MySchema.MyProc 格式的實體參考與呼叫端無關。 不過,採用 EXEC MyDatabase..MyProc 格式的參考即與呼叫端相關。 |
is_ambiguous |
bit |
指出參考模稜兩可,而且可以在執行階段解析成使用者自訂函數、使用者定義型別 (UDT),或 xml 類型資料行的 xquery 參考。 例如,假設 SELECT Sales.GetOrder() FROM Sales.MySales 陳述式定義於預存程序中。 在執行該預存程序之前,不知道 Sales.GetOrder() 是 Sales 結構描述中的使用者自訂函數,還是名為 Sales、類型是 UDT 而且具有名為 GetOrder() 之方法的資料行。 1 = 參考模糊不清。 0 = 參考不會模糊不清,或者在呼叫檢視時,可成功繫結實體。 若為結構描述繫結的參考,則一律是 0。 |
備註
下表將列出建立並維護相依性資訊的實體類型。 系統不會針對規則、預設值、暫存資料表、暫存預存程序或系統物件建立或維護相依性資訊。
實體類型 |
參考實體 |
受參考的實體 |
---|---|---|
資料表 |
是* |
是 |
檢視 |
是 |
是 |
已篩選的索引 |
是** |
否 |
篩選的統計資料 |
是** |
否 |
Transact-SQL 預存程序*** |
是 |
是 |
CLR 預存程序 |
否 |
是 |
Transact-SQL 使用者定義函數 |
是 |
是 |
CLR 使用者定義函數 |
否 |
是 |
CLR 觸發程序 (DML 和 DDL) |
否 |
否 |
Transact-SQL DML 觸發程序 |
是 |
否 |
Transact-SQL 資料庫層級 DDL 觸發程序 |
是 |
否 |
Transact-SQL 伺服器層級 DDL 觸發程序 |
是 |
否 |
擴充預存程序 |
否 |
是 |
佇列 |
否 |
是 |
同義字 |
否 |
是 |
類型 (別名和 CLR 使用者定義型別) |
否 |
是 |
XML 結構描述集合 |
否 |
是 |
資料分割函數 |
否 |
是 |
* 只有當資料表參考計算資料行的定義、CHECK 條件約束或 DEFAULT 條件約束中的 Transact-SQL 模組、使用者定義型別或 XML 結構描述集合時,系統才會將它當做參考實體進行追蹤。
** 篩選述詞中使用的每一個資料行都會當做參考實體來追蹤。
*** 所包含之整數值大於 1 的編號預存程序不會當做參考或受參考的實體進行追蹤。
權限
需要資料庫的 VIEW DEFINITION 權限,以及資料庫之 sys.sql_expression_dependencies 上的 SELECT 權限。 根據預設,SELECT 權限只授與 db_owner 固定資料庫角色的成員。 當 SELECT 和 VIEW DEFINITION 權限授與其他使用者時,被授與者就可以檢視資料庫中的所有相依性。
範例
A.傳回另一個實體所參考的實體
下列範例會傳回 Production.vProductAndDescription 檢視中所參考的資料表和資料行。 這個檢視相依於 referenced_entity_name 和 referenced_column_name 資料行中傳回的實體 (資料表和資料行)。
USE AdventureWorks2012;
GO
SELECT OBJECT_NAME(referencing_id) AS referencing_entity_name,
o.type_desc AS referencing_desciption,
COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS referencing_minor_id,
referencing_class_desc,
referenced_server_name, referenced_database_name, referenced_schema_name,
referenced_entity_name,
COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS referenced_column_name,
is_caller_dependent, is_ambiguous
FROM sys.sql_expression_dependencies AS sed
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id
WHERE referencing_id = OBJECT_ID(N'Production.vProductAndDescription');
GO
B.傳回參考另一個實體的實體
下列範例會傳回參考 Production.Product 資料表的實體。 在 referencing_entity_name 資料行中傳回的實體相依於 Product 資料表。
USE AdventureWorks2012;
GO
SELECT OBJECT_SCHEMA_NAME ( referencing_id ) AS referencing_schema_name,
OBJECT_NAME(referencing_id) AS referencing_entity_name,
o.type_desc AS referencing_desciption,
COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS referencing_minor_id,
referencing_class_desc, referenced_class_desc,
referenced_server_name, referenced_database_name, referenced_schema_name,
referenced_entity_name,
COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS referenced_column_name,
is_caller_dependent, is_ambiguous
FROM sys.sql_expression_dependencies AS sed
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id
WHERE referenced_id = OBJECT_ID(N'Production.Product');
GO
C.傳回跨資料庫相依性
下列範例會傳回所有跨資料庫相依性。 該範例會先在資料庫 db2 和 db3 中,建立參考資料表的資料庫 db1 以及兩個預存程序。 然後會查詢 sys.sql_expression_dependencies 資料表以報告程序和資料表之間的跨資料庫相依性。 請注意,在受參考實體 t3 的 referenced_schema_name 資料行中會傳回 NULL,因為在程序定義中,沒有指定該實體的結構描述名稱。
CREATE DATABASE db1;
GO
USE db1;
GO
CREATE PROCEDURE p1 AS SELECT * FROM db2.s1.t1;
GO
CREATE PROCEDURE p2 AS
UPDATE db3..t3
SET c1 = c1 + 1;
GO
SELECT OBJECT_NAME (referencing_id),referenced_database_name,
referenced_schema_name, referenced_entity_name
FROM sys.sql_expression_dependencies
WHERE referenced_database_name IS NOT NULL;
GO
USE master;
GO
DROP DATABASE db1;
GO