sql >> Database >  >> RDS >> Sqlserver

Zoek verwijzende entiteiten in SQL Server:sys.dm_sql_referencing_entities()

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.


  1. MS-Access-basisklasse en afgeleide objecten

  2. Wijzig het type varchar-veld in integer:kan niet automatisch worden gecast om integer te typen

  3. Hoe NULLIF() werkt in SQL Server

  4. Hoe een enkele kolomwaarden te splitsen in meerdere kolomwaarden?