sql >> データベース >  >> RDS >> Sqlserver

SQL Serverで依存関係を検索する:sql_expression_dependencies

    SQL Serverでは、sys.sql_expression_dependenciesを使用できます。 現在のデータベース内のユーザー定義エンティティへのすべての依存関係を返すシステムカタログビュー。これには、ネイティブにコンパイルされたスカラーユーザー定義関数と他のSQLServerモジュール間の依存関係が含まれます。

    このビューを使用して、次のことができます。

    • 特定のエンティティに依存するエンティティを返す
    • 特定のエンティティが依存するエンティティを返す

    したがって、たとえば、これを使用して、特定のテーブルを参照するすべてのオブジェクトを返すことができます。また、これを使用して、特定のストアドプロシージャがコード内で参照するすべてのオブジェクトを返すこともできます。

    具体的には、sys.sql_expression_dependencies ビューは、次のエンティティの依存関係情報をレポートします:

    • スキーマにバインドされたエンティティ。
    • スキーマにバインドされていないエンティティ。
    • クロスデータベースおよびクロスサーバーエンティティ。エンティティ名が報告されます。ただし、エンティティIDは解決されません。
    • スキーマにバインドされたエンティティに対する列レベルの依存関係。スキーマにバインドされていないオブジェクトの列レベルの依存関係は、sys.dm_sql_referenced_entitiesを使用して返すことができます。
    • サーバーレベルのDDLは、マスターデータベースのコンテキストでトリガーされます。

    例1-返されたすべての列

    sys.sql_expression_dependenciesからすべての列を選択する簡単な例を次に示します。 。これにより、ビューで実際に返されるデータがわかります。これらの列のいずれかをクエリで使用して、関心のあるデータのみを返すことができます。

    SELECT TOP(1) * 
    FROM sys.sql_expression_dependencies;
    

    結果(垂直出力を使用):

    referencing_id            | 114099447
    referencing_minor_id      | 0
    referencing_class         | 1
    referencing_class_desc    | OBJECT_OR_COLUMN
    is_schema_bound_reference | 0
    referenced_class          | 1
    referenced_class_desc     | OBJECT_OR_COLUMN
    referenced_server_name    | NULL
    referenced_database_name  | NULL
    referenced_schema_name    | dbo
    referenced_entity_name    | Client
    referenced_id             | 434100587
    referenced_minor_id       | 0
    is_caller_dependent       | 0
    is_ambiguous              | 0
    

    この例では、垂直方向の出力を使用して、水平方向にスクロールしなくても列名を確認しやすくしています。したがって、列名は左側に表示され、それぞれの値は右側に表示されます。

    また、簡潔にするために、TOP(1)を使用しました 結果を最初の行だけに制限します。

    例2–エンティティに依存するエンティティを検索する

    特定のエンティティに依存するオブジェクトを見つけるには、そのエンティティのreferencing_idを使用します ビューから選択する場合。

    例:

    SELECT
        referenced_server_name AS [Referenced Server],
        referenced_database_name AS [Referenced DB],
        referenced_schema_name AS [Referenced Schema],
        referenced_entity_name AS [Referenced Entity],
        referenced_class_desc AS [Referenced Entity Class] 
    FROM sys.sql_expression_dependencies
    WHERE referencing_id = OBJECT_ID('uspGetClient');
    

    結果:

    +---------------------+-----------------+---------------------+---------------------+---------------------------+
    | Referenced Server   | Referenced DB   | Referenced Schema   | Referenced Entity   | Referenced Entity Class   |
    |---------------------+-----------------+---------------------+---------------------+---------------------------|
    | NULL                | NULL            | dbo                 | Client              | OBJECT_OR_COLUMN          |
    | NULL                | NULL            | NULL                | clientcode          | TYPE                      |
    +---------------------+-----------------+---------------------+---------------------+---------------------------+
    

    ここでは、uspGetClientで参照されているすべてのエンティティを取得します ストアドプロシージャ。

    uspGetClientの実際の定義は次のとおりです :

    CREATE PROCEDURE [dbo].[uspGetClient] @ClientCode clientcode AS
    SELECT 
        FirstName,
        LastName
    FROM [dbo].[Client]
    WHERE ClientCode = @ClientCode;
    

    したがって、Clientというテーブルからデータを選択していることがわかります。 、および@ClientCodeという引数を受け入れます (ユーザー定義のエイリアス)データ型がclientcode

    例3–エンティティが依存するエンティティを検索する

    また、切り替えて、特定のエンティティが依存するオブジェクトを取得することもできます。これを行うには、referenced_idを使用します (referenced_idの代わりに )ビューから選択する場合。

    例:

    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 [Column]
    FROM sys.sql_expression_dependencies
    WHERE referenced_id = OBJECT_ID('Client');
    

    結果:

    +----------------------+----------------------------+------------------+------------+
    | Referencing Entity   | Referencing Minor Entity   | Class            | Column     |
    |----------------------+----------------------------+------------------+------------|
    | uspGetClient         | NULL                       | OBJECT_OR_COLUMN | NULL       |
    | uspGetOrdersByClient | NULL                       | OBJECT_OR_COLUMN | NULL       |
    | chkClientCode        | NULL                       | OBJECT_OR_COLUMN | ClientCode |
    +----------------------+----------------------------+------------------+------------+
    

    この例では、どのエンティティがClientに依存しているかを確認したいと思いました。 テーブル(つまり、SQLコードでそのテーブルを参照するエンティティ)

    別の列も選択したことに気付くでしょう。これは、参照に関する情報を探しているためです。 参照ではなくエンティティ 前の例のようなエンティティ。

    例4–詳細情報を取得する

    このビューを他のビューやテーブルと結合して、より多くの情報を返すことができます。

    たとえば、sys.objectsと結合できます 参照オブジェクトのタイプを取得するには:

    SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity],   
        o.type_desc AS [Type],   
        COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS [Column],
        referenced_entity_name AS [Referenced Entity],   
        COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS [Column]
    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'Client');
    

    結果:

    +----------------------+----------------------+----------+---------------------+------------+
    | Referencing Entity   | Type                 | Column   | Referenced Entity   | Column     |
    |----------------------+----------------------+----------+---------------------+------------|
    | uspGetClient         | SQL_STORED_PROCEDURE | (n/a)    | Client              | (n/a)      |
    | uspGetOrdersByClient | SQL_STORED_PROCEDURE | (n/a)    | Client              | (n/a)      |
    | chkClientCode        | CHECK_CONSTRAINT     | (n/a)    | Client              | ClientCode |
    +----------------------+----------------------+----------+---------------------+------------+
    

    この例では、COALESCE()も追加しました (n/a)を返す関数 referencing_minor_idのときはいつでも NULLです 。この関数は、SQLServerでNULL値を文字列に置き換えることができるいくつかの方法の1つです。

    例5–データベース間およびサーバー間エンティティ

    前述のように、sql_expression_dependencies クロスデータベースおよびクロスサーバーエンティティでも機能します。ただし、この場合、エンティティ名は報告されますが、エンティティIDは解決されません。

    この例では、例2とまったく同じコードを使用していますが、今回は別のエンティティ用です。今回は、uspGetAlbumsByArtistに依存するエンティティを見つけたいと思います。 :

    SELECT
        referenced_server_name AS [Referenced Server],
        referenced_database_name AS [Referenced DB],
        referenced_schema_name AS [Referenced Schema],
        referenced_entity_name AS [Referenced Entity],
        referenced_class_desc AS [Referenced Entity Class] 
    FROM sys.sql_expression_dependencies
    WHERE referencing_id = OBJECT_ID('uspGetClient');
    

    結果:

    +---------------------+-----------------+---------------------+---------------------+---------------------------+
    | Referenced Server   | Referenced DB   | Referenced Schema   | Referenced Entity   | Referenced Entity Class   |
    |---------------------+-----------------+---------------------+---------------------+---------------------------|
    | Homer               | Music           | dbo                 | Albums              | OBJECT_OR_COLUMN          |
    +---------------------+-----------------+---------------------+---------------------+---------------------------+
    

    この例では、参照されるサーバーと参照されるデータベースに値があります(前の例のようにNULLではありません)。これは、uspGetAlbumsByArtist ストアドプロシージャは、4つの部分からなる名前を使用して、リンクサーバー上のエンティティを参照します(前の例のストアドプロシージャは、4つの部分からなる名前を使用せず、3つの部分からなる名前を使用してDBを指定しませんでした) 。

    この例では、Homer リンクサーバーの名前であり、Music ストアドプロシージャがクエリを実行するデータベースです。

    これはuspGetAlbumsByArtistで確認できます。 の定義:

    CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS
    SELECT AlbumName
    FROM [Homer].[Music].[dbo].[Albums]
    WHERE ArtistId = @ArtistId;
    

    公式ドキュメント

    詳細と例については、sys.sql_expression_dependenciesを参照してください。 MicrosoftのWebサイトで。

    これは、SSMSを介して依存関係を取得するための手順を含む別のMicrosoftの記事です。


    1. SQLServerのIDENT_CURRENTと@@IDENTITYとSCOPE_IDENTITYの違い:違いは何ですか?

    2. Android SQLite Journalの動作が変更されましたか?

    3. sqliteの行IDがlistviewと一致しません-ANDROID

    4. PostgreSQLクエリの日付列の算術