I SQL Server kan du använda sys.dm_sql_referencing_entities()
systemdynamisk hanteringsfunktion för att få en lista över alla enheter i den aktuella databasen som refererar till en annan användardefinierad enhet med namn.
Med andra ord, den returnerar en lista över enheter som är beroende av den givna enheten.
Specifikt rapporterar den om följande enhetstyper i den aktuella databasen som refererar till den angivna enheten:
- Schemabundna eller icke-schemabundna enheter
- DDL-utlösare på databasnivå
- DDL-utlösare på servernivå
Syntax
Syntaxen ser ut så här:
sys.dm_sql_referencing_entities ( ' schema_name.referenced_entity_name ' , '' ) ::={ OBJECT | TYP | XML_SCHEMA_COLLECTION | PARTITION_FUNCTION }
Exempel 1 – Grundläggande exempel
Här är ett grundläggande exempel på användning:
ANVÄND WideWorldImporters;VÄLJ *FRÅN sys.dm_sql_referencing_entities ('Application.Cities', 'OBJECT');
Resultat:
+--------------------------------+------------------------ ----------+------------------+--------------------- +--------------------------+---------------------- -+| referensschema_namn | referensenhetsnamn | referens-id | referensklass | referencing_class_desc | är_samtalsberoende ||--------------------------------+------------------- --------+-------------------+----------------------------+ --------------------------+----------------------- || Ansökan | DetermineCustomerAccess | 1051150790 | 1 | OBJECT_OR_COLUMN | 0 || Integration | GetCityUpdates | 1758629308 | 1 | OBJECT_OR_COLUMN | 0 || Webbplats | Kunder | 1694629080 | 1 | OBJECT_OR_COLUMN | 0 || Webbplats | Sök efter kunder | 942626401 | 1 | OBJECT_OR_COLUMN | 0 || Webbplats | SearchForSuppliers | 926626344 | 1 | OBJECT_OR_COLUMN | 0 || Webbplats | Leverantörer | 1678629023 | 1 | OBJECT_OR_COLUMN | 0 |+----------------------------+------------------------ --------+-------------------+----------------------------+ --------------------------+----------------------- +
I det här exemplet finns det sex enheter som refererar till "Application.Cities" i databasen "WideWorldImporters".
Microsoft rekommenderar specifikt att du inte använder asterisken (*
) för att välja alla kolumner från dynamiska hanteringsvyer och funktioner (varav sys.dm_sql_referencing_entities()
är en). Detta beror på att deras scheman och data de returnerar kan komma att ändras i framtida versioner av SQL Server. Detta kan resultera i att kolumner läggs till i slutet av kolumnlistan i framtida versioner, vilket kan förstöra din applikation om du litar på asterisken för att välja alla kolumner.
Därför bör den tidigare koden skrivas om till denna:
Exempel:
ANVÄND WideWorldImporters;VÄLJ referencing_schema_name, referencing_entity_name, referencing_id, referencing_class, referencing_class_desc, is_caller_dependentFROM sys.dm_sql_referencing_entities ( 'Application.JECT');Naturligtvis kan du alltid ange färre kolumner om du vill.
Exempel 2 – Hämta referensenhetstypen
Ovanstående exempel är bra och bra, men det talar inte om för oss den refererande enhetens typ. Med andra ord kan vi inte se om det är en vy, en lagrad procedur, etc.
Du kan få denna information genom att gå med i
sys.dm_sql_referencing_entities()
medsys.objects
.Så vi kunde ändra det tidigare exemplet så här:
SELECT o.type_desc 'Type', re.referencing_schema_name 'Schema', re.referencing_entity_name 'Name'FROM sys.dm_sql_referencing_entities ( 'Application.Cities', 'OBJECT') reINNER JOIN sys.referencing_ oON reINNER JOIN sys.referencing_ .object_idORDER BY 'Typ' ASC;Resultat:
+-----------------------------------+---------------- --+--------------------------------+| Skriv | Schema | Namn ||----------------------------------------+---------------- -+-------------------------|| SQL_INLINE_TABLE_VALUED_FUNCTION | Ansökan | DetermineCustomerAccess || SQL_STORED_PROCEDURE | Integration | GetCityUpdates || SQL_STORED_PROCEDURE | Webbplats | SearchForCustomers || SQL_STORED_PROCEDURE | Webbplats | SearchForSuppliers || VISA | Webbplats | Leverantörer || VISA | Webbplats | Kunder |+-----------------------------------+---------------- -+-------------------------+Exempel 3 – Användardefinierade typer
Här är ett exempel på hur du använder
sys.dm_sql_referencing_entities()
för att returnera entiteter som refererar till en given användardefinierad aliastyp.För det här exemplet skapade jag ett användardefinierat alias som heter
clientcode
. Jag använde det sedan i två kolumner (i två olika tabeller), och jag skapade också en lagrad procedur som refererar till typen efter namn (den accepterar ett argument som heter@ClientCode
som är avclientcode
typ).För att returnera en användardefinierad typ, använd
TYPE
som det andra argumentet.Exempel:
USE Test;SELECT referencing_entity_nameFROM sys.dm_sql_referencing_entities ( 'dbo.clientcode', 'TYPE');Resultat:
+--------------------------------+| referencing_entity_name ||--------------------------------|| uspGetClient || uspGetOrdersByClient |+--------------------------------+Jag kan se på namnen att båda dessa är lagrade procedurer (de båda har prefixet
usp
, vilket är en vanlig konvention när man skapar användardefinierade lagrade procedurer), men vi kan bekräfta detta genom att kontrollerasys.objects
systemkatalogvy igen:SELECT o.type_desc 'Type', re.referencing_schema_name 'Schema', re.referencing_entity_name 'Name'FROM sys.dm_sql_referencing_entities ( 'dbo.clientcode', 'TYPE') reINNER JOIN sys.objects oON re. .object_idORDER BY 'Typ' ASC;Resultat:
+----------------------+----------+---------------- ----------+| Skriv | Schema | Namn ||-----------------------+----------+---------------- ----------|| SQL_STORED_PROCEDURE | dbo | uspGetClient || SQL_STORED_PROCEDURE | dbo | uspGetOrdersByClient |+-----------------------------+--------+------------- ----------+Observera att denna aliastyp används i kolumnerna i två tabeller i denna databas. Dessa visas dock inte i vår lista över beroenden eftersom den användardefinierade typen inte finns i definitionen av en beräknad kolumn,
CHECK
begränsning ellerDEFAULT
begränsning i tabellen.En av tabellerna refererar också till den andra tabellen via en främmande nyckelrestriktion i kolumnen som använder
dbo.clientcode
användardefinierad typ, men den visas inte heller i vår lista.Officiell dokumentation
För mer detaljerad information, se
sys.dm_sql_referencing_entities
på Microsofts webbplats.