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 deresis_select_all
). er indstillet til1
).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 viser0
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 (herafsys.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 frasys.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.