sql >> Database >  >> RDS >> Sqlserver

Vind entiteiten waarnaar wordt verwezen in SQL Server:sys.dm_sql_referenced_entities

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 hun is_select_all is ingesteld op 1 ).

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 toont 0 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 (waarvan sys.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 van sys.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.


  1. Neo4j - Creëer een beperking met Cypher

  2. Groot databasebeheersysteem:ontwerp en architect

  3. een telling voor elke join - optimalisatie

  4. Hoe kan ik mogelijke waarden opsommen in een MySQL-database?