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

Find refererede enheder i SQL Server:sys.dm_sql_referenced_entities

I SQL Server kan du bruge sys.dm_sql_referenced_entities() system dynamisk administrationsfunktion for at få en liste over alle brugerdefinerede entiteter, der refereres til ved navn, i definitionen af ​​en given enhed.

Med andre ord returnerer den en liste over alle brugerdefinerede enheder, som en specifik enhed afhænger af.

Specifikt rapporterer den om følgende enhedstyper, der refereres til af den angivne referenceenhed:

  • Skemabundne enheder
  • Ikke-skemabundne enheder
  • Enheder på tværs af databaser og servere
  • Afhængigheder på kolonneniveau af skemabundne og ikke-skemabundne enheder
  • Brugerdefinerede typer (alias og CLR UDT)
  • XML-skemasamlinger
  • Partitionsfunktioner

Syntaks

Syntaksen ser sådan ud:

sys.dm_sql_referenced_entities ( ' [ skema_navn. ] reference_entity_name ' , '  ' )  ::={ OBJECT | DATABASE_DDL_TRIGGER | SERVER_DDL_TRIGGER }

Eksempel 1 – Grundlæggende eksempel

Her er et eksempel på brug:

USE Test;SELECT referenced_schema_name AS [Skema], referenced_entity_name AS Entity, referenced_minor_name AS Minor, referenced_class_desc AS Class, is_select_all, is_all_columns_foundFROM sys.dm_sql_referenced_entities ( 'dbo.usp');

Resultat:

+------+---------------------- ----------+----------------+---------------------- --+| Skema | Enhed | Mindre | Klasse | er_vælg_alle | er_alle_kolonner_fundet ||----------------------------------------- -----------------------+----------------------- -|| dbo | Kunde | NULL | OBJECT_OR_COLUMN | 1 | 1 || dbo | Kunde | Klientkode | OBJECT_OR_COLUMN | 1 | 1 || dbo | Kunde | Fornavn | OBJECT_OR_COLUMN | 1 | 1 || dbo | Kunde | Efternavn | OBJECT_OR_COLUMN | 1 | 1 || NULL | kundekode | NULL | TYPE | 0 | 0 |+----------------------------- -----------------------+----------------------- -+

Her får jeg alle de entiteter, der er refereret til i dbo.uspGetClient gemt procedure. I dette tilfælde er der fem enheder.

Den første er tabellen kaldet "Client". De næste tre er alle kolonner i den tabel. Den sidste er en brugerdefineret aliasdatatype kaldet "klientkode".

Vi kan også se, at de første fire bruges i en select-sætning, der bruger stjernen (* ) jokertegn for at vælge alle kolonner (fordi deres is_select_all). er indstillet til 1 ).

Her er den faktiske definition, der bruges til at oprette den lagrede procedure, som vi analyserer:

OPRET PROCEDURE [dbo].[uspGetClient] @ClientCode klientkode ASSELECT * FRA [dbo].[Client]WHERE ClientCode =@ClientCode;

Ja, det er en meget enkel gemt procedure, men den er ideel til vores formål. Vi kan se alle de refererede entiteter som returneret af sys.dm_sql_referenced_entities() .

Vi kan også se, at proceduren består af en enkelt SELECT forespørgsel, der bruger jokertegnet for stjerne til at vælge alle kolonner.

Eksempel 2 – Fjern "Vælg alle" (* )

Lad os ændre den lagrede procedure, så den ikke bruger stjerne-jokertegnet til at vælge alle kolonner.

ÆNDRINGSPROCEDURE [dbo].[uspGetClient] @ClientCode klientkode ASSELECT Fornavn, EfternavnFRA [dbo].[Client]WHERE ClientCode =@ClientCode;

Så det returnerer nu eksplicit kolonnerne "FirstName" og "LastName". Der blev ikke fundet nogen jokertegn.

Kør nu sys.dm_sql_referenced_entities() igen:

USE Test;SELECT referenced_schema_name AS [Skema], referenced_entity_name AS Entity, referenced_minor_name AS Minor, referenced_class_desc AS Class, is_select_all, is_all_columns_foundFROM sys.dm_sql_referenced_entities ( 'dbo.usp');

Resultat:

+------+---------------------- ----------+----------------+---------------------- --+| Skema | Enhed | Mindre | Klasse | er_vælg_alle | er_alle_kolonner_fundet ||----------------------------------------- -----------------------+----------------------- -|| dbo | Kunde | NULL | OBJECT_OR_COLUMN | 0 | 1 || dbo | Kunde | Klientkode | OBJECT_OR_COLUMN | 0 | 1 || dbo | Kunde | Fornavn | OBJECT_OR_COLUMN | 0 | 1 || dbo | Kunde | Efternavn | OBJECT_OR_COLUMN | 0 | 1 || NULL | kundekode | NULL | TYPE | 0 | 0 |+----------------------------- -----------------------+----------------------- -+

Denne gang er is_select_all kolonne viser 0 på alle rækker.

Eksempel 3 – Henvisning til en ikke-eksisterende enhed

Hvad hvis din enhed refererer til en ikke-eksisterende enhed?

Hvad hvis din kollega f.eks. dropper en kolonne, der rent faktisk refereres til af en lagret procedure, og derefter kører du sys.dm_sql_referenced_entities() mod den lagrede procedure?

Lad os finde ud af det.

ÆNDRINGSTABEL [dbo].[Client] DROP COLUMN Efternavn;

Jeg har lige droppet LastName kolonne fra min tabel.

Kør nu sys.dm_sql_referenced_entities() igen:

SELECT referenced_schema_name AS [Schema], referenced_entity_name AS Entity, referenced_minor_name AS Minor, referenced_class_desc AS Class, is_select_all, is_all_columns_foundFROM sys.dm_sql_referenced_entities ( 'dbo.uspGetClient'); 

Resultat:

Meddelelse 207, niveau 16, tilstand 1, procedure uspGetClient, linje 4. Ugyldigt kolonnenavn 'Efternavn'. Meddelelse 2020, niveau 16, tilstand 1, linje 3. De afhængigheder, der er rapporteret for entiteten "dbo.uspGetClient" inkluderer muligvis ikke referencer til alle kolonner . Dette skyldes enten, at entiteten refererer til et objekt, der ikke eksisterer, eller på grund af en fejl i en eller flere udsagn i entiteten. Før du kører forespørgslen igen, skal du sikre dig, at der ikke er nogen fejl i entiteten, og at alle objekter, som entiteten refererer til, findes.

Eksempel 4 – Slip hele tabellen

Lad os finde ud af, hvad der sker, hvis vi dropper hele bordet.

DROP TABLE Client;

Tabellen er blevet droppet.

Kør sys.dm_sql_referenced_entities() :

SELECT referenced_schema_name AS [Schema], referenced_entity_name AS Entity, referenced_minor_name AS Minor, referenced_class_desc AS Class, is_select_all, is_all_columns_foundFROM sys.dm_sql_referenced_entities ( 'dbo.uspGetClient'); 

Resultat:

Besked 2020, niveau 16, tilstand 1, linje 2. De afhængigheder, der er rapporteret for entiteten "dbo.uspGetClient" inkluderer muligvis ikke referencer til alle kolonner. Dette skyldes enten, at entiteten refererer til et objekt, der ikke eksisterer, eller på grund af en fejl i en eller flere udsagn i entiteten. Før du kører forespørgslen igen, skal du sikre dig, at der ikke er nogen fejl i entiteten, og at alle objekter, som entiteten refererer til, findes.

Eksempel 5 – Returner alle kolonner

Microsoft fraråder specifikt at bruge stjernen (* ) for at vælge alle kolonner fra dynamiske administrationsvisninger og funktioner (heraf sys.dm_sql_referenced_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.

Når det er sagt, her er et eksempel, der gør netop det:bruger stjernen (* ) for at vælge alle kolonner fra sys.dm_sql_referenced_entities() . Jeg gør kun dette for at vise dig, hvilke kolonner der rent faktisk returneres fra denne funktion (i det mindste i SQL Server 2019).

VÆLG *FRA sys.dm_sql_referenced_entities ( 'dbo.uspGetClient', 'OBJECT');

Resultat (ved hjælp af lodret output):

-[ RECORD 1 ]------------------------referencing_minor_id | 0referenced_server_name | NULLreferenced_databasenavn | NULLreferenced_skemanavn | dboreferenced_entity_name | Clientreferenced_minor_name | NULLreferenced_id | 434100587referenced_minor_id | 0referenced_class | 1referenced_class_desc | OBJECT_OR_COLUMNis_caller_dependent | 0er_tvetydig | 0er_valgt | 1er_opdateret | 0is_select_all | 0er_alle_kolonner_fundet | 1is_insert_all | 0is_incomplete | 0-[ RECORD 2 ]------------------------referencing_minor_id | 0referenced_server_name | NULLreferenced_databasenavn | NULLreferenced_skemanavn | dboreferenced_entity_name | Clientreferenced_minor_name | ClientCodereferenced_id | 434100587referenced_minor_id | 1referenced_class | 1referenced_class_desc | OBJECT_OR_COLUMNis_caller_dependent | 0er_tvetydig | 0er_valgt | 1er_opdateret | 0is_select_all | 0er_alle_kolonner_fundet | 1is_insert_all | 0er_ufuldstændig | 0-[ RECORD 3 ]--------------------------------reference_minor_id | 0referenced_server_name | NULLreferenced_databasenavn | NULLreferenced_skemanavn | dboreferenced_entity_name | Clientreferenced_minor_name | Fornavnreferenced_id | 434100587referenced_minor_id | 2referenced_class | 1referenced_class_desc | OBJECT_OR_COLUMNis_caller_dependent | 0er_tvetydig | 0er_valgt | 1er_opdateret | 0is_select_all | 0er_alle_kolonner_fundet | 1is_insert_all | 0er_ufuldstændig | 0-[ RECORD 4 ]--------------------------------reference_minor_id | 0referenced_server_name | NULLreferenced_databasenavn | NULLreferenced_skemanavn | dboreferenced_entity_name | Clientreferenced_minor_name | LastNamereferenced_id | 434100587referenced_minor_id | 3referenced_class | 1referenced_class_desc | OBJECT_OR_COLUMNis_caller_dependent | 0er_tvetydig | 0er_valgt | 1er_opdateret | 0is_select_all | 0er_alle_kolonner_fundet | 1is_insert_all | 0er_ufuldstændig | 0-[ RECORD 5 ]--------------------------------reference_minor_id | 0referenced_server_name | NULLreferenced_databasenavn | NULLreferenced_skemanavn | NULLreferenced_entity_name | clientcodereferenced_minor_name | NULLreferenced_id | 257referenced_minor_id | 0referenced_class | 6referenced_class_desc | TYPEer_opkaldsafhængig | 0er_tvetydig | 0er_valgt | 0er_opdateret | 0is_select_all | 0er_alle_kolonner_fundet | 0is_insert_all | 0er_ufuldstændig | 0(5 rækker påvirket)

Officiel dokumentation

For mere detaljerede oplysninger og eksempler, se sys.dm_sql_referenced_entities på Microsofts websted.


  1. PostgreSQL funktionskald

  2. Giv brugertilladelser til alle nye tabeller oprettet i postgresql

  3. Implementering af Django + Python 3 + PostgreSQL til AWS Elastic Beanstalk

  4. Sådan installeres SQL Server på SUSE 12