In SQL Server kunt u de sys.dm_sql_referencing_entities()
gebruiken dynamische systeembeheerfunctie om een lijst te krijgen van alle entiteiten in de huidige database die bij naam verwijzen naar een andere door de gebruiker gedefinieerde entiteit.
Met andere woorden, het geeft een lijst met entiteiten terug die afhankelijk zijn van de gegeven entiteit.
Het rapporteert specifiek over de volgende entiteitstypes in de huidige database die verwijzen naar de gespecificeerde entiteit:
- Schemagebonden of niet-schemagebonden entiteiten
- DDL-triggers op databaseniveau
- DDL-triggers op serverniveau
Syntaxis
De syntaxis gaat als volgt:
sys.dm_sql_referencing_entities ( ' schema_name.referenced_entity_name ' , '' ) ::= { OBJECT | TYPE | XML_SCHEMA_COLLECTION | PARTITION_FUNCTION }
Voorbeeld 1 – Basisvoorbeeld
Hier is een eenvoudig gebruiksvoorbeeld:
USE WideWorldImporters; SELECT * FROM sys.dm_sql_referencing_entities ( 'Application.Cities', 'OBJECT');
Resultaat:
+---------------------------+---------------------------+------------------+---------------------+--------------------------+-----------------------+ | 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 dit voorbeeld zijn er zes entiteiten die verwijzen naar 'Application.Cities' in de database 'WideWorldImporters'.
Microsoft raadt specifiek het gebruik van de asterisk (*
) om alle kolommen uit dynamische beheerweergaven en -functies te selecteren (waarvan sys.dm_sql_referencing_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.
Daarom moet de vorige code worden herschreven als volgt:
Voorbeeld:
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');
Je kunt natuurlijk altijd minder kolommen specificeren als je wilt.
Voorbeeld 2 – Verkrijg het type refererende entiteit
Het bovenstaande voorbeeld is allemaal goed en wel, maar het vertelt ons niet het type van de verwijzende entiteit. Met andere woorden, we kunnen niet zien of het een weergave, een opgeslagen procedure, enz. is.
U kunt deze informatie verkrijgen door lid te worden van sys.dm_sql_referencing_entities()
met sys.objects
.
We kunnen het vorige voorbeeld dus als volgt aanpassen:
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;
Resultaat:
+----------------------------------+-------------+-------------------------+ | 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 | +----------------------------------+-------------+-------------------------+
Voorbeeld 3 – Door de gebruiker gedefinieerde typen
Hier is een voorbeeld van het gebruik van sys.dm_sql_referencing_entities()
om entiteiten te retourneren die verwijzen naar een bepaald door de gebruiker gedefinieerd aliastype.
Voor dit voorbeeld heb ik een door de gebruiker gedefinieerde alias gemaakt met de naam clientcode
. Ik heb het vervolgens in twee kolommen (in twee verschillende tabellen) gebruikt en ik heb ook een opgeslagen procedure gemaakt die naar het type verwijst op naam (het accepteert een argument met de naam @ClientCode
welke van de clientcode
. is type).
Gebruik TYPE
. om een door de gebruiker gedefinieerd type terug te geven als het tweede argument.
Voorbeeld:
USE Test; SELECT referencing_entity_name FROM sys.dm_sql_referencing_entities ( 'dbo.clientcode', 'TYPE');
Resultaat:
+---------------------------+ | referencing_entity_name | |---------------------------| | uspGetClient | | uspGetOrdersByClient | +---------------------------+
Ik kan aan de namen zien dat dit beide opgeslagen procedures zijn (ze worden allebei voorafgegaan door usp
, wat een gebruikelijke conventie is bij het maken van door de gebruiker gedefinieerde opgeslagen procedures), maar we kunnen dit bevestigen door de sys.objects
te controleren systeemcatalogus opnieuw bekijken:
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;
Resultaat:
+----------------------+----------+----------------------+ | Type | Schema | Name | |----------------------+----------+----------------------| | SQL_STORED_PROCEDURE | dbo | uspGetClient | | SQL_STORED_PROCEDURE | dbo | uspGetOrdersByClient | +----------------------+----------+----------------------+
Merk op dat dit aliastype wordt gebruikt in de kolommen van twee tabellen in deze database. Deze verschijnen echter niet in onze lijst met afhankelijkheden omdat het door de gebruiker gedefinieerde type niet in de definitie van een berekende kolom staat, CHECK
beperking, of DEFAULT
beperking in de tabel.
Ook verwijst een van de tabellen naar de andere tabel via een externe sleutelbeperking op de kolom die de dbo.clientcode
gebruikt door de gebruiker gedefinieerd type, maar dit komt ook niet voor in onze lijst.
Officiële documentatie
Voor meer gedetailleerde informatie, zie sys.dm_sql_referencing_entities
op de Microsoft-website.