Aracılığıyla paylaş


sys.dm_sql_referenced_entities (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL veritabanı

SQL Server'da belirtilen referans varlığı tanımında isimle referans verilen her kullanıcı tanımlı varlık için bir satır döndürür. İki varlık arasında bir bağımlılık, bir kullanıcı tanımlı varlık, referans edilen varlık, referans varlığı olarak adlandırılan başka bir kullanıcı tanımlı varlığın kalıcı SQL ifadesinde isimleriyle ortaya çıktığında oluşur. Örneğin, bir saklanan prosedür belirtilen referans varlığı ise, bu fonksiyon tablolar, görünümler, kullanıcı tanımlı türler (UDT) veya diğer depolanmış prosedürler gibi depolanmış prosedürde referans verilen tüm kullanıcı tanımlı varlıkları döndürür.

Bu dinamik yönetim fonksiyonunu kullanarak belirtilen referans varlık tarafından referans verilen aşağıdaki varlık türlerini raporlayabilirsiniz:

  • Şema bağlı varlıklar

  • Şema bağlı olmayan varlıklar

  • Veritabanları ve sunucular arası varlıklar

  • Şema bağlı ve şema bağlı olmayan varlıklara sütun düzeyinde bağımlılıklar

  • Kullanıcı tanımlı türler (alias ve CLR UDT)

  • XML şema koleksiyonları

  • Bölüm işlevleri

Sözdizimi

sys.dm_sql_referenced_entities (  
    ' [ schema_name. ] referencing_entity_name ' ,
    ' <referencing_class> ' )  
  
<referencing_class> ::=  
{  
    OBJECT  
  | DATABASE_DDL_TRIGGER  
  | SERVER_DDL_TRIGGER  
}  

Arguments

[ schema_name. ] referencing_entity_name
Referans veren varlığın adıdır. schema_name referans sınıfı OBJECT olduğunda gereklidir.

schema_name.referencing_entity_name'dirnvarchar(517).

<referencing_class> ::= { NESNE | DATABASE_DDL_TRIGGER | SERVER_DDL_TRIGGER }
Belirtilen referans varlığın sınıfıdır. Her ifadede yalnızca bir sınıf belirtilebilir.

<referencing_class>nvarchar(60)'dır.

Döndürülen Tablo

Sütun adı Veri türü Description
referencing_minor_id int Referans varlığı bir sütun olduğunda sütun kimliği; aksi takdirde 0. Null olamaz.
referenced_server_name sysname Referans edilen varlığın sunucusunun adı.

Bu sütun, geçerli dört parçalı bir isim belirtilerek oluşturulan sunucular arası bağımlılıklar için doldurulur. Çok parçalı isimler hakkında bilgi için Transact-SQL sözdizimi konvansiyonlarına bakınız.

Dört parçalı bir isim belirtilmeden referans verilen şema bağlı olmayan bağımlılıklar için NULL.

Şema bağlı varlıklar için NULL çünkü aynı veritabanında olmaları gerekir ve bu nedenle yalnızca iki parçalı (şema.nesne) bir adla tanımlanabilirler.
referenced_database_name sysname Referans verilen varlığın veritabanının adı.

Bu sütun, geçerli üç veya dört parçalı bir isim belirtilerek oluşturulan çapraz veritabanı veya sunucu çapraz referanslar için doldurulur.

Şema sınırı olmayan referanslar için bir veya iki parçalı bir isim kullanılarak belirtildiğinde NULL olur.

Şema bağlı varlıklar için NULL çünkü aynı veritabanında olmaları gerekir ve bu nedenle yalnızca iki parçalı (şema.nesne) bir adla tanımlanabilirler.
referenced_schema_name sysname Referans edilen varlığın ait olduğu şema.

Şema adı belirtilmeden varlığa referans verilen şema sınırı olmayan referanslar için NULL.

Şema bağlı referanslar için asla NULL olmayın.
referenced_entity_name sysname Referans verilen varlığın adı. Null olamaz.
referenced_minor_name sysname Referans edilen varlık bir sütun olduğunda sütun adı; aksi takdirde NULL. Örneğin, referenced_minor_name, referans edilen varlığın kendisini listeleyen satırda NULL'dur.

Referanslı varlık, bir sütunun referans varlığında adıyla tanımlandığı veya ana varlık SELECT * ifadesinde kullanıldığında bir sütundur.
referenced_id int Referans verilen varlığın kimliği. referenced_minor_id 0 değilse, referenced_id sütunun tanımlandığı varlıktır.

Sunucular arası referanslar için her zaman NULL olsun.

Veritabanı çevrimdışı olduğu veya varlık bağlanamadığı için kimlik belirlenemediğinde çapraz veritabanı referansları için NULL.

Kimlik belirlenemezse veritabanı içindeki referanslar için NULL olur. Şema bağlı olmayan referanslar için, referans alan varlık veritabanında bulunmadığında veya isim çözümü arayana bağlı olduğunda kimlik çözülemez. İkinci durumda, is_caller_dependent 1 olarak ayarlanmıştır.

Şema bağlı referanslar için asla NULL olmayın.
referenced_minor_id int Referans edilen varlık bir sütun olduğunda sütun kimliği; aksi takdirde, 0. Örneğin, referans verilen varlığın kendisini listeleyen satırda referenced_minor_is 0'dır.

Şema bağlı olmayan referanslar için, sütun bağımlılıkları yalnızca tüm referans edilen varlıklar sınırlandırılabildiğinde raporlanır. Herhangi bir referans varlık sınırlandırılamazsa, sütun düzeyinde bağımlılıklar raporlanmaz ve referenced_minor_id 0'dır. Örnek D'ye bakınız.
referenced_class tinyint Referans edilen varlığın sınıfı.

1 = Nesne veya sütun

6 = Tip

10 = XML şema koleksiyonu

21 = Bölme fonksiyonu
referenced_class_desc nvarchar(60) Referans verilen varlığın sınıfının tanımı.

OBJECT_OR_COLUMN

TYPE

XML_SCHEMA_COLLECTION

PARTITION_FUNCTION
is_caller_dependent bit Referans edilen varlık için şema bağlamasının çalışma zamanında gerçekleştiğini gösterir; bu nedenle, varlık kimliğinin çözümü arayanın şemasına bağlıdır. Bu, referans edilen varlık bir EXECUTE ifadesi içinde çağrılan bir saklanan prosedür, genişletilmiş bir işlem veya kullanıcı tanımlı bir fonksiyon olduğunda ortaya çıkar.

1 = Referans verilen varlık çağıranlara bağlıdır ve çalışma zamanında çözülür. Bu durumda referenced_id NULL'dur.

0 = Referans verilen varlık kimliği arayanlara bağlı değildir. Şema bağlı referanslar ve şema adını açıkça belirten çapraz veritabanı ve sunucu referansları için her zaman 0 olur. Örneğin, formatta EXEC MyDatabase.MySchema.MyProc bir varlığa yapılan bir referans arayana bağlı değildir. Ancak, formattaki EXEC MyDatabase..MyProc bir referans arayana bağlıdır.
is_ambiguous bit Referansın belirsiz olduğunu ve çalışma zamanında kullanıcı tanımlı bir fonksiyona, kullanıcı tanımlı bir tipe (UDT) veya xml tipindeki bir sütuna xquery referansına çözümlenebildiğini gösterir. Örneğin, ifadenin SELECT Sales.GetOrder() FROM Sales.MySales bir saklanan prosedürde tanımlandığını varsayalım. Saklanan prosedür yürütülene kadar, Sales.GetOrder() şemada kullanıcı tanımlı bir fonksiyon Sales olup olmadığı bilinmez mi yoksa UDT tipi sütununda Sales ve bir metod olarak adlandırılan GetOrder()bir yöntem olup olmadığı bilinmez.

1 = Kullanıcı tanımlı bir fonksiyon veya sütun kullanıcı tanımlı tip (UDT) yöntemine referans belirsizdir.

0 = Referans belirsizdir veya fonksiyon çağrıldığında varlık başarıyla sınırlandırılabilir.

Şema bağlı referanslar için her zaman 0.
is_selected bit 1 = Nesne veya sütun seçilir.
is_updated bit 1 = Nesne veya sütun değiştirilir.
is_select_all bit 1 = Nesne, sadece nesne düzeyinde bir SELECT * cümlesinde kullanılır.
is_all_columns_found bit 1 = Nesne için tüm sütun bağımlılıkları bulunabilir.

0 = Nesne için sütun bağımlılıkları bulunamadı.
is_insert_all bit 1 = Nesne, sadece nesne düzeyinde bir sütun listesi olmayan bir INSERT ifadesinde kullanılır.

Bu sütun SQL Server 2016'da eklenmiştir.
is_incomplete bit 1 = Nesne veya sütunda bağlama hatası vardır ve eksiktir.

Bu sütun SQL Server 2016 SP2'de eklenmiştir.

Exceptions

Aşağıdaki koşullardan herhangi biri altında boş bir sonuç kümesi döndürür:

  • Bir sistem nesnesi belirtilir.

  • Belirtilen varlık mevcut veritabanında mevcut değildir.

  • Belirtilen varlık herhangi bir varlığa referans vermez.

  • Geçersiz bir parametre geçirilir.

Belirtilen referans varlığı numaralandırılmış bir depolanmış prosedür olduğunda hata döndürür.

Sütun bağımlılıkları çözülemediğinde 2020 hatası döndürür. Bu hata, sorgunun nesne düzeyinde bağımlılıkları geri döndürmesini engellemez.

Açıklamalar

Bu fonksiyon, herhangi bir veritabanı bağlamında çalıştırılarak sunucu düzeyinde bir DDL tetikleyicisine referans veren varlıkları döndürebilir.

Aşağıdaki tablo, bağımlılık bilgisinin oluşturulduğu ve korunduğu varlık türlerini listeler. Kurallar, varsayılanlar, geçici tablolar, geçici depolanmış prosedürler veya sistem nesneleri için bağımlılık bilgisi oluşturulmaz veya korunmaz.

Varlık türü Referans varlığı Referans verilen varlık
Tablo Evet* Yes
View Yes Yes
Transact-SQL saklanan prosedür** Yes Yes
CLR depolanmış prosedür Hayı Yes
Transact-SQL kullanıcı tanımlı fonksiyon Yes Yes
CLR kullanıcı tanımlı fonksiyon Hayı Yes
CLR tetikleyicisi (DML ve DDL) Hayı Hayı
Transact-SQL DML tetikleyicisi Yes Hayı
Transact-SQL veritabanı düzeyinde DDL tetikleyicisi Yes Hayı
Transact-SQL sunucu seviyesinde DDL tetikleyici Yes Hayı
Genişletilmiş saklı prosedürler Hayı Yes
Queue Hayı Yes
Synonym Hayı Yes
Tip (takma ad ve CLR kullanıcı tanımlı tip) Hayı Yes
XML şema koleksiyonu Hayı Yes
Bölünme fonksiyonu Hayı Yes

* Bir tablo, yalnızca hesaplanan bir sütun, CHECK kısıtlaması veya DEFAULT kısıtlaması tanımında bir Transact-SQL modülüne, kullanıcı tanımlı tipe veya XML şema koleksiyonuna referans verdiğinde referans varlık olarak takip edilir.

** 1'den büyük tam sayı değeri olan numaralı saklanan prosedürler ne referans veren ne de referans alan varlık olarak takip edilmez.

Permissions

Referans veren varlık üzerinde sys.dm_sql_referenced_entities SELECT izni ve VIEW DEFINITION izni gerektirir. Varsayılan olarak, SELECT izni halka açık olarak verilir. Referans varlığı veritabanı düzeyinde bir DDL tetikleyici olduğunda veritabanında VIEW DEFINITION izni veya veritabanında ALTER DATABASE DDL TRIGGER izni gerektirir. Referans varlığı sunucu düzeyinde bir DDL tetikleyici olduğunda sunucuda VIEW ANY DEFINITION izni gerektirir.

Örnekler

A. Veritabanı düzeyinde bir DDL tetikleyici tarafından referans verilen varlıkları döndürme

Aşağıdaki örnek, veritabanı düzeyindeki DDL tetikleyicisi ddlDatabaseTriggerLogtarafından referans verilen varlıkları (tablolar ve sütunlar) döndürür.

USE AdventureWorks2022;  
GO  
SELECT
        referenced_schema_name,
        referenced_entity_name,
        referenced_minor_name,
        referenced_minor_id,
        referenced_class_desc
    FROM
        sys.dm_sql_referenced_entities (
            'ddlDatabaseTriggerLog',
            'DATABASE_DDL_TRIGGER')
;
GO  

B. Bir nesne tarafından referans verilen varlıkları geri döndürme

Aşağıdaki örnek, kullanıcı tanımlı fonksiyon dbo.ufnGetContactInformationtarafından referanslanan varlıkları geri getirir.

USE AdventureWorks2022;  
GO  
SELECT
        referenced_schema_name,
        referenced_entity_name,
        referenced_minor_name,
        referenced_minor_id,
        referenced_class_desc,
        is_caller_dependent,
        is_ambiguous
    FROM
        sys.dm_sql_referenced_entities (
            'dbo.ufnGetContactInformation',
            'OBJECT')
;
GO  

C. Dönüş sütun bağımlılıkları

Aşağıdaki örnek, hesaplanan sütununc, sütunların a toplamı olarak tanımlandığı tabloyu Table1 oluşturur.b Sonra manzara sys.dm_sql_referenced_entities çağrılır. Görünüm, hesaplanan sütunda tanımlanan her sütun için bir satır döner.

CREATE TABLE dbo.Table1 (a int, b int, c AS a + b);  
GO  
SELECT
        referenced_schema_name AS schema_name,  
        referenced_entity_name AS table_name,  
        referenced_minor_name  AS referenced_column,  
        COALESCE(
            COL_NAME(OBJECT_ID(N'dbo.Table1'),
            referencing_minor_id),
            'N/A') AS referencing_column_name  
    FROM
        sys.dm_sql_referenced_entities ('dbo.Table1', 'OBJECT')
;
GO

-- Remove the table.  
DROP TABLE dbo.Table1;  
GO  

Sonuç kümesi aşağıdadır.

schema_name table_name referenced_column referencing_column  
----------- ---------- ----------------- ------------------  
dbo         Table1     a                 c  
dbo         Table1     b                 c  

D. Şema bağlı olmayan sütun bağımlılıkları döndürülmesi

Aşağıdaki örnek işlemi bırakır Table1 ve oluşturur Table2 ve saklanır Proc1. Prosedür referans Table2 ve var olmayan tablo Table1. Görünüm sys.dm_sql_referenced_entities , referans varlık olarak belirtilen saklanan prosedürle çalıştırılır. Sonuç kümesi, bir satır için Table1 ve 3 satır Table2gösterir. Mevcut Table1 olmadığı için sütun bağımlılıkları çözülemez ve 2020 hatası döner. Sütun, is_all_columns_found keşfedilemeyen sütunların olduğunu belirtmek için 0 Table1 döner.

DROP TABLE IF EXISTS dbo.Table1;
GO  
CREATE TABLE dbo.Table2 (c1 int, c2 int);  
GO  
CREATE PROCEDURE dbo.Proc1 AS  
    SELECT a, b, c FROM Table1;  
    SELECT c1, c2 FROM Table2;  
GO  
SELECT
        referenced_id,
        referenced_entity_name AS table_name,
        referenced_minor_name  AS referenced_column_name,
        is_all_columns_found
    FROM
        sys.dm_sql_referenced_entities ('dbo.Proc1', 'OBJECT');
GO  

Sonuç kümesi aşağıdadır.

referenced_id table_name   referenced_column_name  is_all_columns_found  
------------- ------------ ----------------------- --------------------  
935674381     Table2       NULL                    1  
935674381     Table2       C1                      1  
935674381     Table2       C2                      1  
NULL          Table1       NULL                    0  

Msg 2020, Level 16, State 1, Line 1
The dependencies reported for entity "dbo.Proc1" might not include
 references to all columns. This is either because the entity
 references an object that does not exist or because of an error
 in one or more statements in the entity.  Before rerunning the
 query, ensure that there are no errors in the entity and that
 all objects referenced by the entity exist.

E. Dinamik bağımlılık bakımının gösterilmesi

Bu Örnek E, Örnek D'nin çalıştırıldığını varsayıyor. Örnek E, bağımlılıkların dinamik olarak korunduğunu gösterir. Örnek şunları yapar:

  1. Yeniden yaratır Table1ve bu Örnek D'de düşürülmüştür.
  2. Run Then sys.dm_sql_referenced_entities , referans varlık olarak belirtilen saklanan prosedürle tekrar çalıştırılır.

Sonuç kümesi, her iki tablonun ve depolanan prosedürde tanımlanan ilgili sütunlarının geri döndüğünü gösterir. Ayrıca, is_all_columns_found sütun tüm nesneler ve sütunlar için 1 döndürür.

CREATE TABLE Table1 (a int, b int, c AS a + b);  
GO   
SELECT
        referenced_id,
        referenced_entity_name AS table_name,
        referenced_minor_name  AS column_name,
        is_all_columns_found
    FROM
        sys.dm_sql_referenced_entities ('dbo.Proc1', 'OBJECT');
GO  
DROP TABLE Table1, Table2;  
DROP PROC Proc1;  
GO  

Sonuç kümesi aşağıdadır.

referenced_id table_name   referenced_column_name  is_all_columns_found  
------------- ------------ ----------------------- --------------------  
935674381     Table2       NULL                    1 
935674381     Table2       c1                      1 
935674381     Table2       c2                      1 
967674495     Table1       NULL                    1 
967674495     Table1       a                       1  
967674495     Table1       b                       1  
967674495     Table1       c                       1  

F. Nesne veya sütun kullanımını geri döndürme

Aşağıdaki örnek, depolanan prosedürün HumanResources.uspUpdateEmployeePersonalInfonesnelerini ve sütun bağımlılıklarını geri döndürür. Bu prosedür, NationalIDNumbertablonun sütunlarını , BirthDate,``MaritalStatus, ve GenderEmployee belirli BusinessEntityID bir değere göre günceller. Başka bir saklanan prosedür, upsLogError TRY'de tanımlanır... CATCH blokunu kullanarak herhangi bir çalıştırma hatasını yakalayabilir. , is_updated, ve is_select_all sütunları, is_selectedbu nesnelerin ve sütunların referans nesnesi içinde nasıl kullanıldığına dair bilgi sağlar. Değiştirilen tablo ve sütunlar, is_updated sütununda 1 ile gösterilir. Sadece sütun BusinessEntityID seçilir ve saklanan prosedür uspLogError ne seçilir ne de değiştirilir.

USE AdventureWorks2022;
GO
SELECT
        referenced_entity_name AS table_name,
        referenced_minor_name  AS column_name,
        is_selected,  is_updated,  is_select_all
    FROM
        sys.dm_sql_referenced_entities(
            'HumanResources.uspUpdateEmployeePersonalInfo',
            'OBJECT')
;

Sonuç kümesi aşağıdadır.

table_name    column_name         is_selected is_updated is_select_all  
------------- ------------------- ----------- ---------- -------------  
uspLogError   NULL                0           0          0  
Employee      NULL                0           1          0  
Employee      BusinessEntityID    1           0          0  
Employee      NationalIDNumber    0           1          0  
Employee      BirthDate           0           1          0  
Employee      MaritalStatus       0           1          0  
Employee      Gender              0           1          0

Ayrıca Bkz.

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