sys.sql_expression_dependencies (Transact-SQL)

適用於:SQL ServerAzureSQL Managed InstanceAzure SynapseAnalytics Microsoft Fabric 中的 SQL 分析端點 Microsoft Fabric中的倉庫

針對目前資料庫中使用者定義實體的每個依名稱相依性,各包含一個數據列。 這包括原生編譯、純量使用者定義函式和其他 SQL Server 模組之間的相依性。 當一個稱為 參考實體的實體出現在另一個實體的保存 SQL 運算式中,稱為 參考實體時,就會建立兩個實體之間的相依性。 例如,在檢視定義中參考數據表時,檢視會以參考實體的身分,相依於數據表、參考的實體。 如果卸除數據表,則檢視無法使用。

如需詳細資訊,請參閱記憶體內部 OLTP 的純量使用者定義函數

您可以使用此目錄檢視來報告下列實體的相依性資訊:

  • 架構系結的實體。

  • 非架構系結實體。

  • 跨資料庫和跨伺服器實體。 實體名稱會被報告;然而,實體識別碼尚未解決。

  • 架構系結實體的數據行層級相依性。 非架構系結對象的數據行層級相依性可以使用sys.dm_sql_referenced_entities傳回

  • 伺服器層級的 DDL 會在資料庫上下文 master 中觸發。

資料行名稱 資料類型 描述
referencing_id int 參考實體的標識碼。 不可為空。
referencing_minor_id int 參考實體為數據行時的數據行標識元;否則為 0。 不可為空。
referencing_class tinyint 參考實體的類別。

1 = 物件或柱
12 = 資料庫 DDL 觸發器
13 = 伺服器 DDL 觸發器

不可為空。
referencing_class_desc nvarchar(60) 參考實體類別的描述。

OBJECT_OR_COLUMN
DATABASE_DDL_TRIGGER
SERVER_DDL_TRIGGER

不可為空。
is_schema_bound_reference bit 1 = 被參考的實體是結構綁定的。
0 = 被參考實體非結構綁定。

不可為空。
referenced_class tinyint 參考實體的類別。

1 = 物件或柱
6 = 類型
7 = 索引
10 = XML 結構集合
21 = 分割函數

不可為空。
referenced_class_desc nvarchar(60) 參考實體類別的描述。

OBJECT_OR_COLUMN
TYPE
INDEX
XML_SCHEMA_COLLECTION
PARTITION_FUNCTION

不可為空。
referenced_server_name sysname 所參考實體的伺服器名稱。

這個數據行會填入透過指定有效的四部分名稱所建立的跨伺服器相依性。 如需多部分名稱的詳細資訊,請參閱 Transact-SQL 語法慣例

NULL 適用於非結構綁定的實體,且該實體被參考時未指定四部分名稱。

NULL 對於結構綁定的實體來說,因為它們必須在同一資料庫中,因此只能用兩部分的(schema.object)名稱來定義。
referenced_database_name sysname 所參考實體的資料庫名稱。

這個數據行會填入跨資料庫或跨伺服器參考,這些參考是藉由指定有效的三部分或四部分名稱所建立。

NULL 用於非結構綁定的參考,當以單部分或兩部分名稱指定時。

NULL 對於結構綁定的實體,因為它們必須在同一資料庫中,因此只能用兩部分(結構)來定義。物件)名稱。
referenced_schema_name sysname 參考實體所屬的架構。

NULL 用於非結構綁定的參考,且實體被參考時未指定結構名稱。

絕不適用於 NULL 結構綁定的參考,因為結構綁定的實體必須使用兩部分名稱來定義與引用。
referenced_entity_name sysname 參考實體的名稱。 不可為空。
referenced_id int 參考實體的標識碼。 此欄位的值絕不 NULL 用於結構綁定的參考。 此欄位的值始終 NULL 適用於跨伺服器及跨資料庫的參考。

NULL 如果無法確定 ID 時,用於資料庫中的參考。 對於非模式綁定的參考,在以下情況下無法解析該 ID:

該參考實體在資料庫中不存在。

參考實體的架構取決於呼叫者的架構,並在運行時間解析。 在此情況下,is_caller_dependent設定為 1。
referenced_minor_id int 當參考實體為數據行時,參考數據行的標識符;否則為 0。 不可為空。

當參考實體中以名稱識別數據行,或當 SELECT * 語句中使用父實體時,參考實體就是數據行。
is_caller_dependent bit 指出參考實體的架構系結發生在運行時間;因此,實體標識碼的解析取決於呼叫者的架構。 當參考的實體是預存程式、擴充預存程式,或 EXECUTE 語句中呼叫的非架構系結使用者定義函數時,就會發生這種情況。

1 = 參考實體依賴呼叫者,並在執行時解析。 此時,referenced_id 為 NULL

0 = 參考的實體 ID 並非與呼叫者相關。

針對架構系結參考,以及明確指定架構名稱的跨資料庫和跨伺服器參考,一律為 0。 例如,格式 EXEC MyDatabase.MySchema.MyProc 中對實體的引用並不依賴呼叫者。 不過,格式 EXEC MyDatabase..MyProc 的參考是呼叫端相依的。
is_ambiguous bit 表示參考具有歧義性,且可在執行時解析為使用者定義函式、使用者定義型別(UDT)或 XQuery 對 XML 型別欄位的參考。

例如,假設語句 SELECT Sales.GetOrder() FROM Sales.MySales 是在預存程式中定義。 在儲存程序執行之前,尚不清楚 在結構或欄位Sales.GetOrder()中,是 Sales UDT 型別的使用者定義函式Sales,方法為 GetOrder()

1 = 參考資料模糊不清。

0 = 參考是明確的,或在呼叫視圖時可以成功綁定實體。

架構系結參考一律為 0。

備註

下表列出建立和維護相依性資訊的實體類型。 依賴性資訊不會被建立或維護給規則、預設值、暫存資料表、暫存式儲存程序或系統物件。

注意

Azure Synapse Analytics 支援此列表中的資料表、檢視、篩選統計資料,以及 Transact-SQL 儲存程序實體類型。 僅針對數據表、檢視和篩選統計數據建立和維護相依性資訊。

實體類型 參考實體 參考的實體
Table Yes1 Yes
檢視表​​ Yes Yes
已篩選的索引 2 No
篩選的統計資料 2 No
Transact-SQL 儲存程序3 Yes Yes
CLR 預存程式 No Yes
Transact-SQL 用戶定義函數 Yes Yes
CLR 使用者定義函數 No Yes
CLR 觸發程式 (DML 和 DDL) No No
Transact-SQL DML 觸發程式 Yes No
Transact-SQL 資料庫層級 DDL 觸發程式 Yes No
Transact-SQL 伺服器層級 DDL 觸發程式 Yes No
擴充預存程序 No Yes
Queue No Yes
同義字 No Yes
類型 (別名和 CLR 使用者定義類型) No Yes
XML 結構描述集合 No Yes
分割區函數 No Yes

1 只有當資料表在計算欄位、CHECK 限制 DEFAULT 或限制時,才會被追蹤為參考實體,Transact-SQL 模組、使用者定義型別或 XML 架構集合。

2 過濾器謂詞中使用的每一欄都被追蹤為一個參考實體。

3 整數值大於 1 的編號儲存程序不會被追蹤為參考實體或參考實體。

權限

需要 VIEW 對資料庫取得 DEFINITION 權限及對資料庫的 SELECT 權限 sys.sql_expression_dependencies 。 依預設,SELECT 權限只授與 db_owner 固定資料庫角色的成員。 當 SELECT 和 VIEW DEFINITION 權限被授予其他使用者時,受授權者可以查看資料庫中的所有相依關係。

範例

A. 被其他實體引用的回傳實體

下列範例會傳回檢視 Production.vProductAndDescription中所參考的數據表和數據行。 檢視取決於 和 referenced_entity_name 數據行中傳回的referenced_column_name實體(數據表和數據行)。

USE AdventureWorks2022;
GO

SELECT
    OBJECT_NAME(referencing_id) AS referencing_entity_name,
    o.type_desc AS referencing_description,
    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');

B. 回傳指向另一個實體的實體

下列範例會傳回參考數據表 Production.Product的實體。 數據行中傳回的 referencing_entity_name 實體取決於 Product 數據表。

USE AdventureWorks2022;
GO

SELECT
    OBJECT_SCHEMA_NAME(referencing_id) AS referencing_schema_name,
    OBJECT_NAME(referencing_id) AS referencing_entity_name,
    o.type_desc AS referencing_description,
    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');

C. 回傳跨資料庫相依關係

下列範例會傳回所有跨資料庫相依性。 此範例會先建立資料庫 db1 和兩個預存程式,以參考 資料庫 db2db3中的數據表。 sys.sql_expression_dependencies接著會查詢數據表,以報告程式與數據表之間的跨資料庫相依性。 NULL在所參考實體referenced_schema_name欄位中回傳t3,因為程序定義中未指定該實體的結構名稱。

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;