In SQL Server kunt u de sys.dm_sql_referenced_entities()
gebruiken systeem dynamische beheerfunctie om een lijst te krijgen van alle door de gebruiker gedefinieerde entiteiten waarnaar met naam wordt verwezen in de definitie van een bepaalde entiteit.
Met andere woorden, het geeft een lijst terug van alle door de gebruiker gedefinieerde entiteiten waarvan een specifieke entiteit afhankelijk is.
Het rapporteert specifiek over de volgende entiteitstypes waarnaar wordt verwezen door de gespecificeerde verwijzende entiteit:
- Schemagebonden entiteiten
- Niet-schemagebonden entiteiten
- Cross-database en cross-server entiteiten
- Afhankelijkheden op kolomniveau van schemagebonden en niet-schemagebonden entiteiten
- Door de gebruiker gedefinieerde typen (alias en CLR UDT)
- XML-schemaverzamelingen
- Partitiefuncties
Syntaxis
De syntaxis gaat als volgt:
sys.dm_sql_referenced_entities ( ' [ schema_name. ] referencing_entity_name ' , '' ) ::={ OBJECT | DATABASE_DDL_TRIGGER | SERVER_DDL_TRIGGER }
Voorbeeld 1 – Basisvoorbeeld
Hier is een voorbeeld van gebruik:
USE Test;SELECT referenced_schema_name AS [Schema], referenced_entity_name AS Entiteit, referenced_minor_name AS Minor, referenced_class_desc AS Class, is_select_all, is_all_columns_foundFROM sys.dm_sql_referenced_entities ('Client'.uspGetJECT>)Resultaat:
+----------+------------+------------+--------- ---------+-----------------+---------------------- --+| Schema | Entiteit | Minor | Klasse | is_select_all | is_all_columns_found ||----------+------------+------------+---------- --------+-----------------+----------------------- -|| dbo | Klant | NULL | OBJECT_OR_COLUMN | 1 | 1 || dbo | Klant | Klantcode | OBJECT_OR_COLUMN | 1 | 1 || dbo | Klant | Voornaam | OBJECT_OR_COLUMN | 1 | 1 || dbo | Klant | Achternaam | OBJECT_OR_COLUMN | 1 | 1 || NULL | klantcode | NULL | TYPE | 0 | 0 |+----------+------------+------------+---------- --------+-----------------+----------------------- -+Hier krijg ik alle entiteiten waarnaar wordt verwezen in de
dbo.uspGetClient
opgeslagen procedure. In dit geval zijn er vijf entiteiten.De eerste is de tabel met de naam "Client". De volgende drie zijn allemaal kolommen binnen die tabel. De laatste is een door de gebruiker gedefinieerd alias-gegevenstype genaamd "clientcode".
We kunnen ook zien dat de eerste vier worden gebruikt in een select-statement dat de asterisk gebruikt (
*
) jokerteken om alle kolommen te selecteren (omdat hunis_select_all
is ingesteld op1
).Dit is de daadwerkelijke definitie die wordt gebruikt om de opgeslagen procedure te maken die we analyseren:
PROCEDURE MAKEN [dbo].[uspGetClient] @ClientCode clientcode ASSELECT * FROM [dbo].[Client]WHERE ClientCode =@ClientCode;Ja, het is een heel eenvoudige opgeslagen procedure, maar het is ideaal voor onze doeleinden. We kunnen alle entiteiten waarnaar wordt verwezen zien zoals geretourneerd door
sys.dm_sql_referenced_entities()
.We kunnen ook zien dat de procedure bestaat uit een enkele
SELECT
query die het asterisk-jokerteken gebruikt om alle kolommen te selecteren.Voorbeeld 2 – Verwijder de “Alles selecteren” (
*
)Laten we de opgeslagen procedure wijzigen zodat deze niet het asterisk-jokerteken gebruikt om alle kolommen te selecteren.
WIJZIGINGSPROCEDURE [dbo].[uspGetClient] @ClientCode clientcode ASSELECT FirstName, LastNameFROM [dbo].[Client]WHERE ClientCode =@ClientCode;Dus het retourneert nu expliciet de kolommen "FirstName" en "LastName". Geen jokertekens te vinden.
Voer nu
sys.dm_sql_referenced_entities()
uit nogmaals:USE Test;SELECT referenced_schema_name AS [Schema], referenced_entity_name AS Entiteit, referenced_minor_name AS Minor, referenced_class_desc AS Class, is_select_all, is_all_columns_foundFROM sys.dm_sql_referenced_entities ('Client'.uspGetJECT>)Resultaat:
+----------+------------+------------+--------- ---------+-----------------+---------------------- --+| Schema | Entiteit | Minor | Klasse | is_select_all | is_all_columns_found ||----------+------------+------------+---------- --------+-----------------+----------------------- -|| dbo | Klant | NULL | OBJECT_OR_COLUMN | 0 | 1 || dbo | Klant | Klantcode | OBJECT_OR_COLUMN | 0 | 1 || dbo | Klant | Voornaam | OBJECT_OR_COLUMN | 0 | 1 || dbo | Klant | Achternaam | OBJECT_OR_COLUMN | 0 | 1 || NULL | klantcode | NULL | TYPE | 0 | 0 |+----------+------------+------------+---------- --------+-----------------+----------------------- -+Deze keer is de
is_select_all
kolom toont0
op alle rijen.Voorbeeld 3 – Verwijzen naar een niet-bestaande entiteit
Wat als uw entiteit verwijst naar een niet-bestaande entiteit?
Wat als uw collega bijvoorbeeld een kolom laat vallen waarnaar daadwerkelijk wordt verwezen door een opgeslagen procedure, en u vervolgens
sys.dm_sql_referenced_entities()
uitvoert tegen die opgeslagen procedure?Laten we het uitzoeken.
ALTER TABLE [dbo].[Client] DROP COLUMN Achternaam;Ik heb zojuist de
LastName
. laten vallen kolom uit mijn tabel.Voer nu
sys.dm_sql_referenced_entities()
uit nogmaals:SELECT referenced_schema_name AS [Schema], referenced_entity_name AS Entiteit, referenced_minor_name AS Minor, referenced_class_desc AS Class, is_select_all, is_all_columns_foundFROM sys.dm_sql_referenced_entities ( 'dbo.uspOBGetClient');Resultaat:
Msg 207, Level 16, State 1, Procedure uspGetClient, Line 4Ongeldige kolomnaam 'LastName'.Msg 2020, Level 16, State 1, Line 3De afhankelijkheden die zijn gerapporteerd voor entiteit 'dbo.uspGetClient' bevatten mogelijk geen verwijzingen naar alle kolommen . Dit komt doordat de entiteit verwijst naar een object dat niet bestaat of vanwege een fout in een of meer instructies in de entiteit. Voordat u de query opnieuw uitvoert, moet u ervoor zorgen dat de entiteit geen fouten bevat en dat alle objecten waarnaar door de entiteit wordt verwezen, bestaan.Voorbeeld 4 – Laat de hele tafel vallen
Laten we eens kijken wat er gebeurt als we de hele tafel laten vallen.
DROP TABLE Client;De tafel is gevallen.
Voer
sys.dm_sql_referenced_entities()
uit :SELECT referenced_schema_name AS [Schema], referenced_entity_name AS Entiteit, referenced_minor_name AS Minor, referenced_class_desc AS Class, is_select_all, is_all_columns_foundFROM sys.dm_sql_referenced_entities ( 'dbo.uspOBGetClient');Resultaat:
Msg 2020, Level 16, State 1, Line 2De afhankelijkheden die zijn gerapporteerd voor entiteit "dbo.uspGetClient" bevatten mogelijk geen verwijzingen naar alle kolommen. Dit komt doordat de entiteit verwijst naar een object dat niet bestaat of vanwege een fout in een of meer instructies in de entiteit. Voordat u de query opnieuw uitvoert, moet u ervoor zorgen dat de entiteit geen fouten bevat en dat alle objecten waarnaar door de entiteit wordt verwezen, bestaan.Voorbeeld 5 – Alle kolommen retourneren
Microsoft raadt specifiek het gebruik van de asterisk (
*
) om alle kolommen uit dynamische beheerweergaven en -functies te selecteren (waarvansys.dm_sql_referenced_entities()
is een). Dit komt omdat hun schema's en de gegevens die ze retourneren in toekomstige releases van SQL Server kunnen veranderen. Dit kan ertoe leiden dat in toekomstige releases kolommen worden toegevoegd aan het einde van de kolomlijst, wat uw toepassing in de war kan brengen als u vertrouwt op de asterisk om alle kolommen te selecteren.Dat gezegd hebbende, hier is een voorbeeld dat precies dat doet:gebruikt de asterisk (
*
) om alle kolommen vansys.dm_sql_referenced_entities()
te selecteren . Ik doe dit alleen om u te laten zien welke kolommen daadwerkelijk worden geretourneerd door deze functie (tenminste in SQL Server 2019).SELECT *FROM sys.dm_sql_referenced_entities ( 'dbo.uspGetClient', 'OBJECT');Resultaat (met verticale uitvoer):
-[ RECORD 1 ]-------------------------referencing_minor_id | 0referenced_server_name | NULLreferenced_database_name | NULLreferenced_schema_name | dboreferenced_entity_name | Clientreferenced_minor_name | NULLreferenced_id | 434100587referenced_minor_id | 0referenced_class | 1referenced_class_desc | OBJECT_OR_COLUMNis_caller_dependent | 0is_ambigu | 0is_geselecteerd | 1is_bijgewerkt | 0is_select_all | 0is_all_columns_found | 1is_insert_all | 0is_incomplete | 0-[ RECORD 2 ]-------------------------referencing_minor_id | 0verwezen_servernaam | NULLreferenced_database_name | NULLreferenced_schema_name | dboreferenced_entity_name | Clientreferenced_minor_name | ClientCodereferenced_id | 434100587referenced_minor_id | 1referenced_class | 1referenced_class_desc | OBJECT_OR_COLUMNis_caller_dependent | 0is_ambigu | 0is_geselecteerd | 1is_bijgewerkt | 0is_select_all | 0is_all_columns_found | 1is_insert_all | 0is_incomplete | 0-[ RECORD 3 ]-------------------------referencing_minor_id | 0referenced_server_name | NULLreferenced_database_name | NULLreferenced_schema_name | dboreferenced_entity_name | Clientreferenced_minor_name | FirstNamereferenced_id | 434100587referenced_minor_id | 2referenced_class | 1referenced_class_desc | OBJECT_OR_COLUMNis_caller_dependent | 0is_ambigu | 0is_geselecteerd | 1is_bijgewerkt | 0is_select_all | 0is_all_columns_found | 1is_insert_all | 0is_incomplete | 0-[ RECORD 4 ]-------------------------referencing_minor_id | 0referenced_server_name | NULLreferenced_database_name | NULLreferenced_schema_name | dboreferenced_entity_name | Clientreferenced_minor_name | LastNamereferenced_id | 434100587referenced_minor_id | 3referenced_class | 1referenced_class_desc | OBJECT_OR_COLUMNis_caller_dependent | 0is_ambigu | 0is_geselecteerd | 1is_bijgewerkt | 0is_select_all | 0is_all_columns_found | 1is_insert_all | 0is_incomplete | 0-[ RECORD 5 ]-------------------------referencing_minor_id | 0referenced_server_name | NULLreferenced_database_name | NULLreferenced_schema_name | NULLreferenced_entity_name | clientcodereferenced_minor_name | NULLreferenced_id | 257referenced_minor_id | 0referenced_class | 6referenced_class_desc | TYPEis_caller_dependent | 0is_ambigu | 0is_geselecteerd | 0is_updated | 0is_select_all | 0is_all_columns_found | 0is_insert_all | 0is_incomplete | 0 (5 rijen beïnvloed)Officiële documentatie
Voor meer gedetailleerde informatie en voorbeelden, zie
sys.dm_sql_referenced_entities
op de Microsoft-website.