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.