sys.sql_expression_dependencies (Transact-SQL)
適用於:SQL Server Azure SQL 受控執行個體 Microsoft Fabric 中 Microsoft Fabric倉儲中的Azure Synapse AnalyticsAnalytics Platform System (PDW)SQL 分析端點
針對目前資料庫中使用者定義實體的每個依名稱相依性,各包含一個數據列。 這包括原生編譯、純量使用者定義函式和其他 SQL Server 模組之間的相依性。 當一個稱為 參考實體的實體出現在另一個實體的保存 SQL 運算式中,稱為 參考實體時,就會建立兩個實體之間的相依性。 例如,在檢視定義中參考數據表時,檢視會以參考實體的身分,相依於數據表、參考的實體。 如果卸除數據表,則檢視無法使用。
如需詳細資訊,請參閱記憶體內部 OLTP 的純量使用者定義函數。
您可以使用此目錄檢視來報告下列實體的相依性資訊:
架構系結的實體。
非架構系結實體。
跨資料庫和跨伺服器實體。 報告實體名稱;不過,不會解析實體標識碼。
架構系結實體的數據行層級相依性。 非架構系結對象的數據行層級相依性可以使用sys.dm_sql_referenced_entities傳回。
在 master 資料庫的內容中時,伺服器層級 DDL 觸發程式。
資料行名稱 | 資料類型 | 描述 |
---|---|---|
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 語法慣例。 未指定四部分名稱之非架構系結實體的 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。 針對非架構系結參考,在下列情況下無法解析標識符: 參考的實體不存在於資料庫中。 參考實體的架構取決於呼叫者的架構,並在運行時間解析。 在此情況下,is_caller_dependent設定為 1。 |
referenced_minor_id | int | 當參考實體為數據行時,參考數據行的標識符;否則為 0。 不可為 Null。 當參考實體中以名稱識別數據行,或當 SELECT * 語句中使用父實體時,參考實體就是數據行。 |
is_caller_dependent | bit | 指出參考實體的架構系結發生在運行時間;因此,實體標識碼的解析取決於呼叫者的架構。 當參考的實體是預存程式、擴充預存程式,或 EXECUTE 語句中呼叫的非架構系結使用者定義函數時,就會發生這種情況。 1 = 參考的實體相依於呼叫端,並在運行時間解析。 在此情況下,referenced_id為 NULL。 0 = 參考的實體識別碼與呼叫端無關。 針對架構系結參考,以及明確指定架構名稱的跨資料庫和跨伺服器參考,一律為 0。 例如,格式 EXEC MyDatabase.MySchema.MyProc 實體的參考不是呼叫端相依。 不過,格式 EXEC MyDatabase..MyProc 的參考是呼叫端相依的。 |
is_ambiguous | bit | 表示參考模棱兩可,而且可以在運行時間解析為使用者定義函數、用戶定義型別 (UDT),或 xml 類型的 xquery 參考。 例如,假設語句 SELECT Sales.GetOrder() FROM Sales.MySales 是在預存程式中定義。 在執行預存程式之前,不知道 是Sales.GetOrder() 名為 之方法之架構或Sales 類型 UDT GetOrder() 資料行中的Sales 使用者定義函式。1 = 參考模棱兩可。 0 = 參考明確,或呼叫檢視時可以成功系結實體。 架構系結參考一律為 0。 |
備註
下表列出建立和維護相依性資訊的實體類型。 不會針對規則、預設值、臨時表、暫存程式或系統物件建立或維護相依性資訊。
注意
Azure Synapse Analytics 和平行數據倉儲支援此列表中的數據表、檢視、篩選統計數據和 Transact-SQL 預存程式實體類型。 僅針對數據表、檢視和篩選統計數據建立和維護相依性資訊。
實體類型 | 參考實體 | 參考的實體 |
---|---|---|
Table | 是* | Yes |
檢視表 | Yes | Yes |
已篩選的索引 | 是** | No |
篩選的統計資料 | 是** | No |
Transact-SQL 預存程式*** | Yes | Yes |
CLR 預存程式 | No | Yes |
Transact-SQL 用戶定義函數 | Yes | Yes |
CLR 使用者定義函數 | No | Yes |
CLR 觸發程式 (DML 和 DDL) | No | No |
Transact-SQL DML 觸發程式 | 是 | No |
Transact-SQL 資料庫層級 DDL 觸發程式 | 是 | No |
Transact-SQL 伺服器層級 DDL 觸發程式 | 是 | No |
擴充預存程序 | No | Yes |
Queue | No | Yes |
同義字 | No | Yes |
類型 (別名和 CLR 使用者定義類型) | No | Yes |
XML 結構描述集合 | No | Yes |
分割區函數 | No | Yes |
* 只有在數據表參考計算數據行、CHECK 條件約束或 DEFAULT 條件約束的定義中參考 Transact-SQL 模組、使用者定義型別或 XML 架構集合時,才會將數據表追蹤為參考實體。
** 篩選述詞中使用的每個數據行都會追蹤為參考實體。
具有大於 1 之整數值的編號預存程式不會追蹤為參考或參考實體。
權限
需要資料庫的 VIEW DEFINITION 權限和資料庫之 sys.sql_expression_dependencies 的 SELECT 權限。 依預設,SELECT 權限只授與 db_owner 固定資料庫角色的成員。 當 SELECT 和 VIEW DEFINITION 權限授與其他使用者時,被授與者就可以檢視資料庫中的所有相依性。
範例
A. 傳回另一個實體所參考的實體
下列範例會傳回檢視 Production.vProductAndDescription
中所參考的數據表和數據行。 檢視取決於 和 referenced_column_name
數據行中傳回的referenced_entity_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');
GO
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');
GO
C. 傳回跨資料庫相依性
下列範例會傳回所有跨資料庫相依性。 此範例會先建立資料庫 db1
和兩個預存程式,以參考 資料庫 db2
和 db3
中的數據表。 sys.sql_expression_dependencies
接著會查詢數據表,以報告程式與數據表之間的跨資料庫相依性。 請注意,NULL 會在參考實體t3
的數據行中referenced_schema_name
傳回,因為程式定義中未指定該實體的架構名稱。
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
另請參閱
sys.dm_sql_referenced_entities (Transact-SQL)
sys.dm_sql_referencing_entities (Transact-SQL)
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應