sql >> Database teknologi >  >> RDS >> Sqlserver

Find referenceenheder i SQL Server:sys.dm_sql_referencing_entities()

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() med sys.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 af clientcode 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 kontrollere sys.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 eller DEFAULT 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.


  1. Hvordan bruger man CASE Statement i MySQL?

  2. Sådan sammenkædes streng- og NULL-værdier i SQL Server

  3. Hvordan man erklærer input-output-parametre i SQL Server Stored Procedure/-funktion?

  4. Django ConnectionAbortedError:[WinError 10053] En etableret forbindelse blev afbrudt af softwaren på din værtsmaskine