Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verweisende Entitäten in SQL Server suchen:sys.dm_sql_referencing_entities()

In SQL Server können Sie sys.dm_sql_referencing_entities() verwenden systemdynamische Verwaltungsfunktion, um eine Liste aller Entitäten in der aktuellen Datenbank zu erhalten, die eine andere benutzerdefinierte Entität namentlich referenzieren.

Mit anderen Worten, es gibt eine Liste von Entitäten zurück, die von der angegebenen Entität abhängen.

Insbesondere berichtet es über die folgenden Entitätstypen in der aktuellen Datenbank, die auf die angegebene Entität verweisen:

  • Schemagebundene oder nicht schemagebundene Entitäten
  • DDL-Trigger auf Datenbankebene
  • DDL-Trigger auf Serverebene

Syntax

Die Syntax lautet wie folgt:

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

Beispiel 1 – Einfaches Beispiel

Hier ist ein einfaches Verwendungsbeispiel:

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

Ergebnis:

+---------------------------+---------------------------+------------------+---------------------+--------------------------+-----------------------+
| 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 diesem Beispiel gibt es sechs Entitäten, die auf „Application.Cities“ in der „WideWorldImporters“-Datenbank verweisen.

Microsoft rät ausdrücklich davon ab, das Sternchen (* ), um alle Spalten aus dynamischen Verwaltungsansichten und -funktionen auszuwählen (darunter sys.dm_sql_referencing_entities()). ist ein). Dies liegt daran, dass sich ihre Schemas und die von ihnen zurückgegebenen Daten in zukünftigen Versionen von SQL Server ändern können. Dies könnte dazu führen, dass in zukünftigen Versionen Spalten am Ende der Spaltenliste hinzugefügt werden, was Ihre Anwendung durcheinander bringen könnte, wenn Sie sich auf das Sternchen verlassen, um alle Spalten auszuwählen.

Daher sollte der vorherige Code wie folgt umgeschrieben werden:

Beispiel:

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');

Natürlich können Sie jederzeit weniger Spalten angeben, wenn Sie möchten.

Beispiel 2 – Abrufen des referenzierenden Entitätstyps

Das obige Beispiel ist alles gut und schön, aber es sagt uns nicht den Typ der referenzierenden Entität. Mit anderen Worten, wir können nicht sehen, ob es sich um eine Ansicht, eine gespeicherte Prozedur usw. handelt.

Sie können diese Informationen abrufen, indem Sie sys.dm_sql_referencing_entities() beitreten mit sys.objects .

Wir könnten also das vorherige Beispiel wie folgt ändern:

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;  

Ergebnis:

+----------------------------------+-------------+-------------------------+
| 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               |
+----------------------------------+-------------+-------------------------+

Beispiel 3 – Benutzerdefinierte Typen

Hier ist ein Beispiel für die Verwendung von sys.dm_sql_referencing_entities() um Entitäten zurückzugeben, die auf einen bestimmten benutzerdefinierten Aliastyp verweisen.

Für dieses Beispiel habe ich einen benutzerdefinierten Alias ​​namens clientcode erstellt . Ich habe es dann in zwei Spalten (in zwei verschiedenen Tabellen) verwendet, und ich habe auch eine gespeicherte Prozedur erstellt, die den Typ nach Namen referenziert (sie akzeptiert ein Argument namens @ClientCode das ist der clientcode Typ).

Um einen benutzerdefinierten Typ zurückzugeben, verwenden Sie TYPE als zweites Argument.

Beispiel:

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

Ergebnis:

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

Ich kann an den Namen erkennen, dass es sich bei beiden um gespeicherte Prozeduren handelt (beide haben das Präfix usp , was eine gängige Konvention beim Erstellen benutzerdefinierter gespeicherter Prozeduren ist), aber wir können dies bestätigen, indem wir die sys.objects überprüfen Systemkatalogansicht noch einmal:

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;  

Ergebnis:

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

Beachten Sie, dass dieser Aliastyp in den Spalten von zwei Tabellen in dieser Datenbank verwendet wird. Diese erscheinen jedoch nicht in unserer Liste der Abhängigkeiten, da der benutzerdefinierte Typ nicht in der Definition einer berechneten Spalte, CHECK, enthalten ist Einschränkung oder DEFAULT Einschränkung in der Tabelle.

Außerdem verweist eine der Tabellen auf die andere Tabelle über eine Fremdschlüsseleinschränkung für die Spalte, die den dbo.clientcode verwendet benutzerdefinierter Typ, aber auch dieser erscheint nicht in unserer Liste.

Offizielle Dokumentation

Ausführlichere Informationen finden Sie unter sys.dm_sql_referencing_entities auf der Microsoft-Website.