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

Suchen Sie Abhängigkeiten in SQL Server:sql_expression_dependencies

In SQL Server können Sie die sys.sql_expression_dependencies verwenden Systemkatalogansicht, um alle Abhängigkeiten von einer benutzerdefinierten Entität in der aktuellen Datenbank zurückzugeben. Dazu gehören Abhängigkeiten zwischen nativ kompilierten, benutzerdefinierten Skalarfunktionen und anderen SQL Server-Modulen.

Sie können diese Ansicht für Folgendes verwenden:

  • Entitäten zurückgeben, die von einer bestimmten Entität abhängen
  • Entitäten zurückgeben, von denen eine bestimmte Entität abhängt

Sie könnten damit beispielsweise alle Objekte zurückgeben, die auf eine bestimmte Tabelle verweisen. Sie können es auch verwenden, um alle Objekte zurückzugeben, auf die eine bestimmte gespeicherte Prozedur in ihrem Code verweist.

Insbesondere die sys.sql_expression_dependencies Anzeigen von Berichtsabhängigkeitsinformationen für die folgenden Entitäten:

  • Schemagebundene Entitäten.
  • Nicht schemagebundene Entitäten.
  • Datenbank- und serverübergreifende Entitäten. Entitätsnamen werden gemeldet; Entitäts-IDs werden jedoch nicht aufgelöst.
  • Abhängigkeiten auf Spaltenebene von schemagebundenen Entitäten. Abhängigkeiten auf Spaltenebene für nicht schemagebundene Objekte können mithilfe von sys.dm_sql_referenced_entities.
  • zurückgegeben werden
  • DDL-Trigger auf Serverebene im Kontext der Master-Datenbank.

Beispiel 1 – Alle Spalten zurückgegeben

Hier ist ein kurzes Beispiel, das alle Spalten aus sys.sql_expression_dependencies auswählt . Dies zeigt uns, welche Daten tatsächlich in der Ansicht zurückgegeben werden, und wir können jede dieser Spalten in unseren Abfragen verwenden, um nur die Daten zurückzugeben, an denen wir interessiert sind.

SELECT TOP(1) * FROM sys.sql_expression_dependencies;

Ergebnis (bei vertikaler Ausgabe):

Referenz-ID | 114099447referencing_minor_id | 0referenzierungsklasse | 1referencing_class_desc | OBJECT_OR_COLUMNis_schema_bound_reference | 0referenzierte_Klasse | 1referenced_class_desc | OBJECT_OR_COLUMNreferenzierter_Servername | NULLreferenzierter_Datenbankname | NULLreferenzierter_Schemaname | dboreferenced_entity_name | Clientreferenzierte_id | 434100587referenced_minor_id | 0ist_anruferabhängig | 0ist_mehrdeutig | 0

Dieses Beispiel verwendet eine vertikale Ausgabe, um die Spaltennamen besser sehen zu können, ohne horizontal scrollen zu müssen. Daher werden die Spaltennamen auf der linken Seite und ihre jeweiligen Werte auf der rechten Seite aufgeführt.

Außerdem habe ich der Kürze halber TOP(1) verwendet um die Ergebnisse auf die erste Zeile zu beschränken.

Beispiel 2 – Entitäten finden, die von einer Entität abhängen

Um Objekte zu finden, die von einer bestimmten Entität abhängen, verwenden Sie die referencing_id dieser Entität bei der Auswahl aus der Ansicht.

Beispiel:

SELECT referenced_server_name AS [referenzierter Server], referenced_database_name AS [referenzierte Datenbank], referenced_schema_name AS [referenziertes Schema], referenced_entity_name AS [referenzierte Entität], referenced_class_desc AS [referenzierte Entitätsklasse] FROM sys.sql_expression_dependenciesWHERE referencing_id =OBJECT_ID('uspGetClient' );

Ergebnis:

+---------------------+-----------------+------ --------------------------------+------------ ---------------+| Referenzierter Server | Referenzierter DB | Referenziertes Schema | Referenzierte Entität | Referenzierte Entitätsklasse ||---------------------+----------------+----- -----------+---------------------+----------- ----------------|| NULL | NULL | dbo | Auftraggeber | OBJECT_OR_COLUMN || NULL | NULL | NULL | Kundencode | TYP |+---------------------+-----------------+------- --------------+---------------------+--------------------- --------------+

Hier bekomme ich alle Entitäten, die im uspGetClient referenziert werden gespeicherte Prozedur.

Hier ist die eigentliche Definition für uspGetClient :

CREATE PROCEDURE [dbo].[uspGetClient] @ClientCode Clientcode ASSELECT FirstName, LastNameFROM [dbo].[Client]WHERE ClientCode =@ClientCode;

Wir können also sehen, dass es Daten aus einer Tabelle namens Client auswählt , und es akzeptiert ein Argument namens @ClientCode mit einem (benutzerdefinierten Alias) Datentyp von clientcode .

Beispiel 3 – Entitäten finden, von denen eine Entität abhängt

Sie können es auch umschalten und die Objekte abrufen, von denen eine bestimmte Entität abhängt. Verwenden Sie dazu referenced_id (anstelle von referencing_id ) bei der Auswahl aus der Ansicht.

Beispiel:

SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity], OBJECT_NAME(referencing_minor_id) AS [Referencing Minor Entity], referencing_class_desc AS [Class], COL_NAME(referenced_id, referenced_minor_id) AS [Spalte]FROM sys.sql_expression_dependenciesWHERE referenced_id =OBJECT_ID(' Kunde');

Ergebnis:

+---------------------+------------------------------- -----+------------------+------------+| Referenzierende Entität | Verweis auf Nebenentität | Klasse | Spalte ||----------------------+-------------------------------- ----+------------------+------------|| uspGetClient | NULL | OBJECT_OR_COLUMN | NULL || uspGetOrdersByClient | NULL | OBJECT_OR_COLUMN | NULL || chkClientCode | NULL | OBJECT_OR_COLUMN | Kundencode |+----------------------+-------------------------------- ----+------------------+------------+

In diesem Beispiel wollte ich sehen, welche Entitäten vom Client abhängen Tabelle (d. h. welche Entitäten referenzieren diese Tabelle in ihrem SQL-Code).

Sie werden feststellen, dass ich auch andere Spalten ausgewählt habe. Dies liegt daran, dass ich nach Informationen zur Referenzierung suche Entität, nicht die referenzierte Entität wie im vorherigen Beispiel.

Beispiel 4 – Weitere Informationen abrufen

Sie können diese Ansicht mit anderen Ansichten und/oder Tabellen verbinden, um weitere Informationen zurückzugeben.

Sie können es beispielsweise mit sys.objects verknüpfen um den Typ des referenzierenden Objekts zu erhalten:

SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity], o.type_desc AS [Type], COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS [Spalte], referenced_entity_name AS [Referenced Entity] , COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS [Spalte]FROM sys.sql_expression_dependencies AS sed INNER JOIN sys.objects AS o ON sed.referencing_id =o.object_id WHERE referenced_id =OBJECT_ID(N' Kunde');

Ergebnis:

+---------------------+----------------------+ ----------------------+------------+| Referenzierende Entität | Geben Sie | ein Spalte | Referenzierte Entität | Spalte ||----------------------+---------------------+- ---------+---------------------+------------|| uspGetClient | SQL_STORED_PROCEDURE | (n/a) | Auftraggeber | (n/a) || uspGetOrdersByClient | SQL_STORED_PROCEDURE | (n/a) | Auftraggeber | (n/a) || chkClientCode | CHECK_CONSTRAINT | (n/a) | Auftraggeber | Kundencode |+----------------------+---------------------+- ---------+---------------------+------------+

In diesem Beispiel habe ich auch COALESCE() hinzugefügt Funktion, um (n/a) zurückzugeben wann immer referencing_minor_id ist NULL . Diese Funktion ist eine von mehreren Möglichkeiten, wie Sie in SQL Server einen NULL-Wert durch eine Zeichenfolge ersetzen können.

Beispiel 5 – Datenbank- und serverübergreifende Entitäten

Wie bereits erwähnt, sql_expression_dependencies funktioniert auch auf datenbank- und serverübergreifenden Entitäten. In diesem Fall werden Entitätsnamen gemeldet, aber Entitäts-IDs werden nicht aufgelöst.

Dieses Beispiel verwendet genau denselben Code wie Beispiel 2, außer dass es diesmal für eine andere Entität gilt. Dieses Mal möchte ich Entitäten finden, die von uspGetAlbumsByArtist abhängen :

SELECT referenced_server_name AS [Referenzierter Server], referenced_database_name AS [Referenzierte DB], referenced_schema_name AS [Referenziertes Schema], referenced_entity_name AS [Referenzierte Entität], referenced_class_desc AS [Referenzierte Entitätsklasse] FROM sys.sql_expression_dependenciesWHERE referencing_id =OBJECT_ID('uspGetAlbumsByArtist' );

Ergebnis:

+---------------------+-----------------+------ --------------------------------+------------ ---------------+| Referenzierter Server | Referenzierter DB | Referenziertes Schema | Referenzierte Entität | Referenzierte Entitätsklasse ||---------------------+----------------+----- -----------+---------------------+----------- ----------------|| Homer | Musik | dbo | Alben | OBJEKT_ODER_SPALTE |+---------------------+-----------------+------- --------------+---------------------+--------------------- --------------+

In diesem Beispiel haben der referenzierte Server und die referenzierte Datenbank einen Wert (anstatt NULL wie im vorherigen Beispiel zu sein). Das liegt daran, dass uspGetAlbumsByArtist Die gespeicherte Prozedur verwendet einen vierteiligen Namen, um auf die Entität auf einem Verbindungsserver zu verweisen (die gespeicherte Prozedur aus dem vorherigen Beispiel verwendete keinen vierteiligen Namen und auch keinen dreiteiligen Namen, um die Datenbank anzugeben). .

In diesem Beispiel Homer ist der Name des Verbindungsservers und Music ist die Datenbank, die von der gespeicherten Prozedur abgefragt wird.

Wir können dies in uspGetAlbumsByArtist sehen Definition:

CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int ASSELECT AlbumNameFROM [Homer].[Music].[dbo].[Albums]WHERE ArtistId =@ArtistId;

Offizielle Dokumentation

Ausführlichere Informationen und Beispiele finden Sie unter sys.sql_expression_dependencies auf der Microsoft-Website.

Hier ist ein weiterer Microsoft-Artikel, der Anweisungen zum Abrufen von Abhängigkeiten über SSMS enthält.