sql >> Databasteknik >  >> RDS >> Sqlserver

Hitta referensenheter i SQL Server:sys.dm_sql_referencing_entities()

I SQL Server kan du använda sys.dm_sql_referencing_entities() systemdynamisk hanteringsfunktion för att få en lista över alla enheter i den aktuella databasen som refererar till en annan användardefinierad enhet med namn.

Med andra ord, den returnerar en lista över enheter som är beroende av den givna enheten.

Specifikt rapporterar den om följande enhetstyper i den aktuella databasen som refererar till den angivna enheten:

  • Schemabundna eller icke-schemabundna enheter
  • DDL-utlösare på databasnivå
  • DDL-utlösare på servernivå

Syntax

Syntaxen ser ut så här:

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

Exempel 1 – Grundläggande exempel

Här är ett grundläggande exempel på användning:

ANVÄND WideWorldImporters;VÄLJ *FRÅN sys.dm_sql_referencing_entities ('Application.Cities', 'OBJECT');

Resultat:

+--------------------------------+------------------------ ----------+------------------+--------------------- +--------------------------+---------------------- -+| referensschema_namn | referensenhetsnamn | referens-id | referensklass | referencing_class_desc | är_samtalsberoende ||--------------------------------+------------------- --------+-------------------+----------------------------+ --------------------------+----------------------- || Ansökan | DetermineCustomerAccess | 1051150790 | 1 | OBJECT_OR_COLUMN | 0 || Integration | GetCityUpdates | 1758629308 | 1 | OBJECT_OR_COLUMN | 0 || Webbplats | Kunder | 1694629080 | 1 | OBJECT_OR_COLUMN | 0 || Webbplats | Sök efter kunder | 942626401 | 1 | OBJECT_OR_COLUMN | 0 || Webbplats | SearchForSuppliers | 926626344 | 1 | OBJECT_OR_COLUMN | 0 || Webbplats | Leverantörer | 1678629023 | 1 | OBJECT_OR_COLUMN | 0 |+----------------------------+------------------------ --------+-------------------+----------------------------+ --------------------------+----------------------- +

I det här exemplet finns det sex enheter som refererar till "Application.Cities" i databasen "WideWorldImporters".

Microsoft rekommenderar specifikt att du inte använder asterisken (* ) för att välja alla kolumner från dynamiska hanteringsvyer och funktioner (varav sys.dm_sql_referencing_entities() är en). Detta beror på att deras scheman och data de returnerar kan komma att ändras i framtida versioner av SQL Server. Detta kan resultera i att kolumner läggs till i slutet av kolumnlistan i framtida versioner, vilket kan förstöra din applikation om du litar på asterisken för att välja alla kolumner.

Därför bör den tidigare koden skrivas om till denna:

Exempel:

ANVÄND WideWorldImporters;VÄLJ referencing_schema_name, referencing_entity_name, referencing_id, referencing_class, referencing_class_desc, is_caller_dependentFROM sys.dm_sql_referencing_entities ( 'Application.JECT');

Naturligtvis kan du alltid ange färre kolumner om du vill.

Exempel 2 – Hämta referensenhetstypen

Ovanstående exempel är bra och bra, men det talar inte om för oss den refererande enhetens typ. Med andra ord kan vi inte se om det är en vy, en lagrad procedur, etc.

Du kan få denna information genom att gå med i sys.dm_sql_referencing_entities() med sys.objects .

Så vi kunde ändra det tidigare exemplet så här:

SELECT o.type_desc 'Type', re.referencing_schema_name 'Schema', re.referencing_entity_name 'Name'FROM sys.dm_sql_referencing_entities ( 'Application.Cities', 'OBJECT') reINNER JOIN sys.referencing_ oON reINNER JOIN sys.referencing_ .object_idORDER BY 'Typ' ASC; 

Resultat:

+-----------------------------------+---------------- --+--------------------------------+| Skriv | Schema | Namn ||----------------------------------------+---------------- -+-------------------------|| SQL_INLINE_TABLE_VALUED_FUNCTION | Ansökan | DetermineCustomerAccess || SQL_STORED_PROCEDURE | Integration | GetCityUpdates || SQL_STORED_PROCEDURE | Webbplats | SearchForCustomers || SQL_STORED_PROCEDURE | Webbplats | SearchForSuppliers || VISA | Webbplats | Leverantörer || VISA | Webbplats | Kunder |+-----------------------------------+---------------- -+-------------------------+

Exempel 3 – Användardefinierade typer

Här är ett exempel på hur du använder sys.dm_sql_referencing_entities() för att returnera entiteter som refererar till en given användardefinierad aliastyp.

För det här exemplet skapade jag ett användardefinierat alias som heter clientcode . Jag använde det sedan i två kolumner (i två olika tabeller), och jag skapade också en lagrad procedur som refererar till typen efter namn (den accepterar ett argument som heter @ClientCode som är av clientcode typ).

För att returnera en användardefinierad typ, använd TYPE som det andra argumentet.

Exempel:

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

Resultat:

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

Jag kan se på namnen att båda dessa är lagrade procedurer (de båda har prefixet usp , vilket är en vanlig konvention när man skapar användardefinierade lagrade procedurer), men vi kan bekräfta detta genom att kontrollera sys.objects systemkatalogvy igen:

SELECT o.type_desc 'Type', re.referencing_schema_name 'Schema', re.referencing_entity_name 'Name'FROM sys.dm_sql_referencing_entities ( 'dbo.clientcode', 'TYPE') reINNER JOIN sys.objects oON re. .object_idORDER BY 'Typ' ASC; 

Resultat:

+----------------------+----------+---------------- ----------+| Skriv | Schema | Namn ||-----------------------+----------+---------------- ----------|| SQL_STORED_PROCEDURE | dbo | uspGetClient || SQL_STORED_PROCEDURE | dbo | uspGetOrdersByClient |+-----------------------------+--------+------------- ----------+

Observera att denna aliastyp används i kolumnerna i två tabeller i denna databas. Dessa visas dock inte i vår lista över beroenden eftersom den användardefinierade typen inte finns i definitionen av en beräknad kolumn, CHECK begränsning eller DEFAULT begränsning i tabellen.

En av tabellerna refererar också till den andra tabellen via en främmande nyckelrestriktion i kolumnen som använder dbo.clientcode användardefinierad typ, men den visas inte heller i vår lista.

Officiell dokumentation

För mer detaljerad information, se sys.dm_sql_referencing_entities på Microsofts webbplats.


  1. Hur TRIM()-funktionen fungerar i MySQL

  2. Returnera det aktuella inloggningsnamnet i SQL Server (T-SQL)

  3. problem med att använda Oracle-parametrar i SELECT IN

  4. NULL Complexities – Del 2