sys.dm_sql_referencing_entities (Transact-SQL)

適用範圍: 是SQL Server (所有支援的版本) 是Azure SQL Database

針對在目前資料庫中依據名稱參考其他使用者定義實體的每個實體,各傳回一個資料列。 在另一個實體(稱為 參考實體)的持續性 SQL 運算式中依名稱出現 時,會 建立兩個實體之間的相依性。 例如,如果使用者定義型別 (UDT) 指定為受參考的實體,這個函數就會傳回在定義中依據名稱參考該類型的每個使用者自訂實體。 此函數不會傳回其他資料庫中可能參考指定實體的實體。 這個函數必須在 master 資料庫的內容中執行,以便傳回伺服器層級 DDL 觸發程序當做參考實體。

您可以使用這個動態管理函數來回報下列在目前資料庫中參考指定實體的實體類型:

  • 結構描述繫結或非結構描述繫結的實體

  • 資料庫層級 DDL 觸發程序

  • 伺服器層級 DDL 觸發程序

適用於:SQL Server (SQL Server 2008 及更新版本)、SQL Database。

主題連結圖示 Transact-SQL 語法慣例

語法

sys.dm_sql_referencing_entities (  
    ' schema_name.referenced_entity_name ' , ' <referenced_class> ' )  
  
<referenced_class> ::=  
{  
    OBJECT  
  | TYPE  
  | XML_SCHEMA_COLLECTION  
  | PARTITION_FUNCTION  
}  

引數

schema_name.referenced_entity_name 這是受參考實體的名稱。

schema_name 是必要項目,但受參考類別為 PARTITION_FUNCTION 的情況除外。

schema_name.referenced_entity_nameNvarchar (517)

<referenced_class> ::= { OBJECT | TYPE | XML_SCHEMA_COLLECTION | PARTITION_FUNCTION } 這是受參考實體的類別。 每個陳述式只能指定一個類別。

<referenced_class>Nvarchar (60) 。

傳回的資料表

資料行名稱 資料類型 描述
referencing_schema_name sysname 參考實體所屬的結構描述。 可為 Null。

若為資料庫層級與伺服器層級 DDL 觸發程序,則為 NULL。
referencing_entity_name sysname 參考實體的名稱。 不可為 Null。
referencing_id int 參考實體的識別碼。 不可為 Null。
referencing_class tinyint 參考實體的類別。 不可為 Null。

1 = 物件

12 = 資料庫層級 DDL 觸發程序

13 = 伺服器層級 DDL 觸發程序
referencing_class_desc nvarchar(60) 參考實體之類別的描述。

OBJECT

DATABASE_DDL_TRIGGER

SERVER_DDL_TRIGGER
is_caller_dependent bit 指出在執行階段發生之受參考實體識別碼的解析,因為它會相依於呼叫端的結構描述。

1 = 參考實體可能會參考此實體。不過,受參考實體識別碼的解析是呼叫端相依而且無法判斷。 只有預存程序的非結構描述繫結參考、擴充預存程序,或在 EXECUTE 陳述式內部呼叫的使用者定義函數,才會發生這個事件。

0 = 受參考的實體不是呼叫端相依。

例外狀況

在下列任何情況下,都會傳回空的結果集:

  • 已指定系統物件。

  • 指定的實體不存在目前的資料庫中。

  • 指定的實體沒有參考任何實體。

  • 傳遞了無效的參數。

當指定的受參考實體是已編號的預存程序時,就會傳回錯誤。

備註

下表將列出建立並維護相依性資訊的實體類型。 系統不會針對規則、預設值、暫存資料表、暫存預存程序或系統物件建立或維護相依性資訊。

實體類型 參考實體 受參考的實體
資料表 是*
檢視
Transact-SQL 預存程序**
CLR 預存程序
Transact-SQL 使用者定義函數
CLR 使用者定義函數
CLR 觸發程序 (DML 和 DDL)
Transact-SQL DML 觸發程序
Transact-SQL 資料庫層級 DDL 觸發程序
Transact-SQL 伺服器層級 DDL 觸發程序
擴充預存程序
佇列
同義字
類型 (別名和 CLR 使用者定義型別)
XML 結構描述集合
分割區函數

* 只有當資料表參考 Transact-SQL 計算資料行的定義、CHECK 條件約束或 DEFAULT 條件約束中的模組、使用者定義型別或 XML 架構集合時,才會將資料表視為參考實體進行追蹤。

** 所包含之整數值大於 1 的編號預存程序不會當做參考或受參考的實體進行追蹤。

權限

SQL Server 2008 - SQL Server 2012 (11.x)

  • 需要所參考物件的 CONTROL 權限。 當受參考實體為資料分割函數時,便需要資料庫的 CONTROL 權限。

  • 需要 sys.dm_sql_referencing_entities 的 SELECT 許可權。 根據預設,SELECT 權限會授與 public。

SQL Server 2014 (12.x) - SQL Server 2019 (15.x)

  • 不需要所參考物件的權限。 如果使用者有其中一部分參考實體的 VIEW DEFINITION,則會傳回部分結果。

  • 如果參考實體是物件,需要物件的 VIEW DEFINITION。

  • 當參考實體為資料庫層級 DDL 觸發程序時,需要資料庫的 VIEW DEFINITION。

  • 當參考實體為伺服器層級 DDL 觸發程序時,需要伺服器的 VIEW ANY DEFINITION。

範例

A. 傳回參考給定實體的實體

下列範例會傳回目前資料庫中參考指定資料表的實體。

USE AdventureWorks2012;  
GO  
SELECT referencing_schema_name, referencing_entity_name, referencing_id, referencing_class_desc, is_caller_dependent  
FROM sys.dm_sql_referencing_entities ('Production.Product', 'OBJECT');  
GO  

B. 傳回參考給定類型的實體

下列範例會傳回參考別名類型 dbo.Flag 的實體。 結果集會顯示有兩個預存程序使用這個類型。 此 dbo.Flag 類型也用於資料表中數個數據行的定義中, HumanResources.Employee 但因為該類型不在資料表的計算資料行、CHECK 條件約束或 DEFAULT 條件約束的定義中,所以不會傳回資料表的任何資料列 HumanResources.Employee

USE AdventureWorks2012;  
GO  
SELECT referencing_schema_name, referencing_entity_name, referencing_id, referencing_class_desc, is_caller_dependent  
FROM sys.dm_sql_referencing_entities ('dbo.Flag', 'TYPE');  
GO  

以下為結果集。

referencing_schema_name referencing_entity_name   referencing_id referencing_class_desc is_caller_dependent  
----------------------- -------------------------  ------------- ---------------------- -------------------  
HumanResources          uspUpdateEmployeeHireInfo  1803153469    OBJECT_OR_COLUMN       0  
HumanResources          uspUpdateEmployeeLogin     1819153526    OBJECT_OR_COLUMN       0  
(2 row(s) affected)`  

另請參閱

sys.dm_sql_referenced_entities (Transact-SQL)
sys.sql_expression_dependencies (Transact-SQL)