I SQL Server kan du bruge sys.dm_sql_referencing_entities()
system dynamisk administrationsfunktion for at få en liste over alle enheder i den aktuelle database, der refererer til en anden brugerdefineret enhed ved navn.
Med andre ord returnerer den en liste over entiteter, der afhænger af den givne enhed.
Specifikt rapporterer den om følgende enhedstyper i den aktuelle database, der refererer til den angivne enhed:
- Skemabundne eller ikke-skemabundne enheder
- DDL-udløsere på databaseniveau
- DDL-udløsere på serverniveau
Syntaks
Syntaksen ser sådan ud:
sys.dm_sql_referencing_entities ( ' schema_name.referenced_entity_name ' , '' ) ::={ OBJECT | TYPE | XML_SCHEMA_COLLECTION | PARTITION_FUNCTION }
Eksempel 1 – Grundlæggende eksempel
Her er et grundlæggende eksempel på brug:
BRUG WideWorldImporters;VÆLG *FRA sys.dm_sql_referencing_entities ('Application.Cities', 'OBJECT');
Resultat:
+-----------------------------+------------------------ ----------+-------------------+--------------------- +------------------------+---------------------- -+| referenceskema_navn | reference_entity_name | reference_id | referenceklasse | reference_class_desc | er_opkaldsafhængig ||--------------------------------+------------------- --------------------------+----------------------+ --------------------------+----------------------- || Ansøgning | Bestem kundeadgang | 1051150790 | 1 | OBJECT_OR_COLUMN | 0 || Integration | GetCityUpdates | 1758629308 | 1 | OBJECT_OR_COLUMN | 0 || Hjemmeside | Kunder | 1694629080 | 1 | OBJECT_OR_COLUMN | 0 || Hjemmeside | Søg efter kunder | 942626401 | 1 | OBJECT_OR_COLUMN | 0 || Hjemmeside | SearchForSuppliers | 926626344 | 1 | OBJECT_OR_COLUMN | 0 || Hjemmeside | Leverandører | 1678629023 | 1 | OBJECT_OR_COLUMN | 0 |+----------------------------+------------------------ --------------------------+----------------------+ --------------------------+----------------------- +
I dette eksempel er der seks enheder, der refererer til "Application.Cities" i databasen "WideWorldImporters".
Microsoft fraråder specifikt at bruge stjernen (*
) for at vælge alle kolonner fra dynamiske administrationsvisninger og funktioner (heraf sys.dm_sql_referencing_entities()
er en). Dette skyldes, at deres skemaer og de data, de returnerer, kan ændre sig i fremtidige udgivelser af SQL Server. Dette kan resultere i, at kolonner føjes til slutningen af kolonnelisten i fremtidige udgivelser, hvilket kan ødelægge din applikation, hvis du stoler på stjernen for at vælge alle kolonner.
Derfor bør den tidligere kode omskrives til denne:
Eksempel:
BRUG WideWorldImporters;VÆLG referencing_schema_name, reference_entity_name, reference_id, reference_class, referencing_class_desc, is_caller_dependentFROM sys.dm_sql_referencing_entities ('Application.Cities');Du kan selvfølgelig altid angive færre kolonner, hvis du vil.
Eksempel 2 – Hent referenceenhedstypen
Ovenstående eksempel er alt i orden, men det fortæller os ikke den refererende enheds type. Vi kan med andre ord ikke se, om det er en visning, en lagret procedure osv.
Du kan få disse oplysninger ved at tilmelde dig
sys.dm_sql_referencing_entities()
medsys.objects
.Så vi kunne ændre det forrige eksempel sådan her:
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 'Type' ASC;Resultat:
+-----------------------------------+---------------- --+-------------------------+| Skriv | Skema | Navn ||----------------------------------------+---------------- -+------------------------|| SQL_INLINE_TABLE_VALUED_FUNCTION | Ansøgning | Bestem kundeadgang || SQL_STORED_PROCEDURE | Integration | GetCityUpdates || SQL_STORED_PROCEDURE | Hjemmeside | SearchForCustomers || SQL_STORED_PROCEDURE | Hjemmeside | SearchForSuppliers || SE | Hjemmeside | Leverandører || SE | Hjemmeside | Kunder |+------------------------------------+---------------- -+-------------------------+Eksempel 3 – Brugerdefinerede typer
Her er et eksempel på brug af
sys.dm_sql_referencing_entities()
for at returnere enheder, der refererer til en given brugerdefineret aliastype.Til dette eksempel oprettede jeg et brugerdefineret alias kaldet
clientcode
. Jeg brugte den derefter i to kolonner (i to forskellige tabeller), og jeg oprettede også en lagret procedure, der refererer til typen efter navn (den accepterer et argument kaldet@ClientCode
som er afclientcode
type).For at returnere en brugerdefineret type, brug
TYPE
som det andet argument.Eksempel:
USE Test;SELECT referencing_entity_nameFROM sys.dm_sql_referencing_entities ( 'dbo.clientcode', 'TYPE');Resultat:
+--------------------------------+| reference_entity_name ||--------------------------------|| uspGetClient || uspGetOrdersByClient |+--------------------------------+Jeg kan se ved navnene, at begge disse er lagrede procedurer (de har begge præfiks med
usp
, som er en almindelig konvention ved oprettelse af brugerdefinerede lagrede procedurer), men vi kan bekræfte dette ved at kontrolleresys.objects
systemkatalogvisning 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 'Type' ASC;Resultat:
+-----------------------+----------+---------------- ----------+| Skriv | Skema | Navn ||-----------------------+-------------- ----------|| SQL_STORED_PROCEDURE | dbo | uspGetClient || SQL_STORED_PROCEDURE | dbo | uspGetOrdersByClient |+------------------------------ ----------+Bemærk, at denne aliastype bruges i kolonnerne i to tabeller i denne database. Disse vises dog ikke på vores liste over afhængigheder, fordi den brugerdefinerede type ikke er i definitionen af en beregnet kolonne,
CHECK
begrænsning ellerDEFAULT
begrænsning i tabellen.En af tabellerne refererer også til den anden tabel via en fremmednøglebegrænsning på kolonnen, der bruger
dbo.clientcode
brugerdefineret type, men denne vises heller ikke på vores liste.Officiel dokumentation
For mere detaljerede oplysninger, se
sys.dm_sql_referencing_entities
på Microsofts websted.