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

Trova entità di riferimento in SQL Server:sys.dm_sql_referencing_entities()

In SQL Server puoi utilizzare sys.dm_sql_referencing_entities() funzione di gestione dinamica del sistema per ottenere un elenco di tutte le entità nel database corrente che fanno riferimento a un'altra entità definita dall'utente per nome.

In altre parole, restituisce un elenco di entità che dipendono dall'entità data.

In particolare, segnala i seguenti tipi di entità nel database corrente che fanno riferimento all'entità specificata:

  • Entità legate allo schema o non vincolate allo schema
  • Trigger DDL a livello di database
  • Trigger DDL a livello di server

Sintassi

La sintassi è questa:

sys.dm_sql_referencing_entities (  
    ' schema_name.referenced_entity_name ' , '  ' )  
  
 ::=  
{  
    OBJECT  
  | TYPE  
  | XML_SCHEMA_COLLECTION  
  | PARTITION_FUNCTION  
}

Esempio 1 – Esempio di base

Ecco un semplice esempio di utilizzo:

USE WideWorldImporters;
SELECT *
FROM sys.dm_sql_referencing_entities (
    'Application.Cities', 
    'OBJECT');

Risultato:

+---------------------------+---------------------------+------------------+---------------------+--------------------------+-----------------------+
| referencing_schema_name   | referencing_entity_name   | referencing_id   | referencing_class   | referencing_class_desc   | is_caller_dependent   |
|---------------------------+---------------------------+------------------+---------------------+--------------------------+-----------------------|
| Application               | DetermineCustomerAccess   | 1051150790       | 1                   | OBJECT_OR_COLUMN         | 0                     |
| Integration               | GetCityUpdates            | 1758629308       | 1                   | OBJECT_OR_COLUMN         | 0                     |
| Website                   | Customers                 | 1694629080       | 1                   | OBJECT_OR_COLUMN         | 0                     |
| Website                   | SearchForCustomers        | 942626401        | 1                   | OBJECT_OR_COLUMN         | 0                     |
| Website                   | SearchForSuppliers        | 926626344        | 1                   | OBJECT_OR_COLUMN         | 0                     |
| Website                   | Suppliers                 | 1678629023       | 1                   | OBJECT_OR_COLUMN         | 0                     |
+---------------------------+---------------------------+------------------+---------------------+--------------------------+-----------------------+

In questo esempio, ci sono sei entità che fanno riferimento a "Application.Cities" nel database "WideWorldImporters".

Microsoft sconsiglia espressamente di utilizzare l'asterisco (* ) per selezionare tutte le colonne dalle viste e funzioni a gestione dinamica (di cui sys.dm_sql_referencing_entities() è uno). Ciò è dovuto al fatto che i relativi schemi e i dati restituiti potrebbero cambiare nelle versioni future di SQL Server. Ciò potrebbe comportare l'aggiunta di colonne alla fine dell'elenco delle colonne nelle versioni future, il che potrebbe rovinare la tua applicazione se fai affidamento sull'asterisco per selezionare tutte le colonne.

Pertanto, il codice precedente dovrebbe essere riscritto in questo modo:

Esempio:

USE WideWorldImporters;
SELECT 
  referencing_schema_name,
  referencing_entity_name,
  referencing_id,
  referencing_class,
  referencing_class_desc,
  is_caller_dependent
FROM sys.dm_sql_referencing_entities (
    'Application.Cities', 
    'OBJECT');

Naturalmente, se lo desideri, puoi sempre specificare meno colonne.

Esempio 2:ottenere il tipo di entità di riferimento

L'esempio sopra è tutto a posto, ma non ci dice il tipo dell'entità di riferimento. In altre parole, non possiamo vedere se si tratta di una vista, di una procedura memorizzata, ecc.

Puoi ottenere queste informazioni unendoti a sys.dm_sql_referencing_entities() con sys.objects .

Quindi potremmo modificare l'esempio precedente in questo modo:

SELECT 
  o.type_desc 'Type',
  re.referencing_schema_name 'Schema',
  re.referencing_entity_name 'Name'
FROM sys.dm_sql_referencing_entities (
    'Application.Cities', 
    'OBJECT') re
INNER JOIN sys.objects o
ON re.referencing_id = o.object_id
ORDER BY 'Type' ASC;  

Risultato:

+----------------------------------+-------------+-------------------------+
| Type                             | Schema      | Name                    |
|----------------------------------+-------------+-------------------------|
| SQL_INLINE_TABLE_VALUED_FUNCTION | Application | DetermineCustomerAccess |
| SQL_STORED_PROCEDURE             | Integration | GetCityUpdates          |
| SQL_STORED_PROCEDURE             | Website     | SearchForCustomers      |
| SQL_STORED_PROCEDURE             | Website     | SearchForSuppliers      |
| VIEW                             | Website     | Suppliers               |
| VIEW                             | Website     | Customers               |
+----------------------------------+-------------+-------------------------+

Esempio 3 – Tipi definiti dall'utente

Ecco un esempio di utilizzo di sys.dm_sql_referencing_entities() per restituire entità che fanno riferimento a un determinato tipo di alias definito dall'utente.

Per questo esempio, ho creato un alias definito dall'utente chiamato clientcode . L'ho quindi utilizzato in due colonne (in due tabelle diverse) e ho anche creato una stored procedure che fa riferimento al tipo per nome (accetta un argomento chiamato @ClientCode che è del clientcode tipo).

Per restituire un tipo definito dall'utente, usa TYPE come secondo argomento.

Esempio:

USE Test;
SELECT 
  referencing_entity_name
FROM sys.dm_sql_referencing_entities (
    'dbo.clientcode', 
    'TYPE');

Risultato:

+---------------------------+
| referencing_entity_name   |
|---------------------------|
| uspGetClient              |
| uspGetOrdersByClient      |
+---------------------------+

Posso dire dai nomi che entrambe sono stored procedure (entrambe sono precedute da usp , che è una convenzione comune durante la creazione di stored procedure definite dall'utente), ma possiamo confermarlo controllando sys.objects vista del catalogo di sistema ancora una volta:

SELECT 
  o.type_desc 'Type',
  re.referencing_schema_name 'Schema',
  re.referencing_entity_name 'Name'
FROM sys.dm_sql_referencing_entities (
    'dbo.clientcode', 
    'TYPE') re
INNER JOIN sys.objects o
ON re.referencing_id = o.object_id
ORDER BY 'Type' ASC;  

Risultato:

+----------------------+----------+----------------------+
| Type                 | Schema   | Name                 |
|----------------------+----------+----------------------|
| SQL_STORED_PROCEDURE | dbo      | uspGetClient         |
| SQL_STORED_PROCEDURE | dbo      | uspGetOrdersByClient |
+----------------------+----------+----------------------+

Si noti che questo tipo di alias viene utilizzato nelle colonne di due tabelle in questo database. Tuttavia, queste non vengono visualizzate nel nostro elenco di dipendenze perché il tipo definito dall'utente non è nella definizione di una colonna calcolata, CHECK vincolo o DEFAULT vincolo nella tabella.

Inoltre, una delle tabelle fa riferimento all'altra tabella tramite un vincolo di chiave esterna sulla colonna che utilizza dbo.clientcode tipo definito dall'utente, ma anche questo non appare nel nostro elenco.

Documentazione ufficiale

Per informazioni più dettagliate, vedere sys.dm_sql_referencing_entities sul sito Web Microsoft.