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.