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

SQL Serverで参照エンティティを検索する:sys.dm_sql_referenced_entities

    SQL Serverでは、sys.dm_sql_referenced_entities()を使用できます。 特定のエンティティの定義で、名前で参照されるすべてのユーザー定義エンティティのリストを取得するシステム動的管理機能。

    つまり、特定のエンティティが依存するすべてのユーザー定義エンティティのリストを返します。

    具体的には、指定された参照エンティティによって参照される次のエンティティタイプについてレポートします。

    • スキーマにバインドされたエンティティ
    • スキーマにバインドされていないエンティティ
    • クロスデータベースおよびクロスサーバーエンティティ
    • スキーマにバインドされたエンティティとスキーマにバインドされていないエンティティに対する列レベルの依存関係
    • ユーザー定義タイプ(エイリアスおよびCLR UDT)
    • XMLスキーマコレクション
    • パーティション関数

    構文

    構文は次のようになります:

    sys.dm_sql_referenced_entities (  
        ' [ schema_name. ] referencing_entity_name ' ,
        '  ' )  
      
     ::=  
    {  
        OBJECT  
      | DATABASE_DDL_TRIGGER  
      | SERVER_DDL_TRIGGER  
    }
    

    例1-基本的な例

    使用例は次のとおりです。

    USE Test;
    SELECT 
      referenced_schema_name AS [Schema],
      referenced_entity_name AS Entity,
      referenced_minor_name AS Minor,
      referenced_class_desc AS Class,
      is_select_all,
      is_all_columns_found
    FROM sys.dm_sql_referenced_entities (
        'dbo.uspGetClient', 
        'OBJECT');
    

    結果:

    +----------+------------+------------+------------------+-----------------+------------------------+
    | Schema   | Entity     | Minor      | Class            | is_select_all   | is_all_columns_found   |
    |----------+------------+------------+------------------+-----------------+------------------------|
    | dbo      | Client     | NULL       | OBJECT_OR_COLUMN | 1               | 1                      |
    | dbo      | Client     | ClientCode | OBJECT_OR_COLUMN | 1               | 1                      |
    | dbo      | Client     | FirstName  | OBJECT_OR_COLUMN | 1               | 1                      |
    | dbo      | Client     | LastName   | OBJECT_OR_COLUMN | 1               | 1                      |
    | NULL     | clientcode | NULL       | TYPE             | 0               | 0                      |
    +----------+------------+------------+------------------+-----------------+------------------------+
    

    ここで、dbo.uspGetClientで参照されているすべてのエンティティを取得します ストアドプロシージャ。この場合、5つのエンティティがあります。

    最初のものは「クライアント」と呼ばれるテーブルです。次の3つは、そのテーブル内のすべての列です。最後の1つは、「clientcode」と呼ばれるユーザー定義のエイリアスデータ型です。

    また、最初の4つがアスタリスク(*)を使用するselectステートメントで使用されていることもわかります。 )すべての列を選択するためのワイルドカード(is_select_allのため) 1に設定されています )。

    分析しているストアドプロシージャを作成するために使用される実際の定義は次のとおりです。

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

    はい、これは非常に単純なストアドプロシージャですが、私たちの目的には理想的です。 sys.dm_sql_referenced_entities()によって返されるすべての参照エンティティを確認できます。 。

    また、プロシージャが単一のSELECTで構成されていることもわかります。 アスタリスクワイルドカードを使用してすべての列を選択するクエリ。

    例2–「すべて選択」を削除します(*

    アスタリスクのワイルドカードを使用してすべての列を選択しないように、ストアドプロシージャを変更してみましょう。

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

    そのため、「FirstName」列と「LastName」列を明示的に返すようになりました。ワイルドカードは見つかりません。

    次に、sys.dm_sql_referenced_entities()を実行します もう一度:

    USE Test;
    SELECT 
      referenced_schema_name AS [Schema],
      referenced_entity_name AS Entity,
      referenced_minor_name AS Minor,
      referenced_class_desc AS Class,
      is_select_all,
      is_all_columns_found
    FROM sys.dm_sql_referenced_entities (
        'dbo.uspGetClient', 
        'OBJECT');
    

    結果:

    +----------+------------+------------+------------------+-----------------+------------------------+
    | Schema   | Entity     | Minor      | Class            | is_select_all   | is_all_columns_found   |
    |----------+------------+------------+------------------+-----------------+------------------------|
    | dbo      | Client     | NULL       | OBJECT_OR_COLUMN | 0               | 1                      |
    | dbo      | Client     | ClientCode | OBJECT_OR_COLUMN | 0               | 1                      |
    | dbo      | Client     | FirstName  | OBJECT_OR_COLUMN | 0               | 1                      |
    | dbo      | Client     | LastName   | OBJECT_OR_COLUMN | 0               | 1                      |
    | NULL     | clientcode | NULL       | TYPE             | 0               | 0                      |
    +----------+------------+------------+------------------+-----------------+------------------------+
    

    今回は、is_select_all 列には0が表示されます すべての行で。

    例3–存在しないエンティティの参照

    エンティティが存在しないエンティティを参照している場合はどうなりますか?

    たとえば、同僚がストアドプロシージャによって実際に参照されている列を削除してから、sys.dm_sql_referenced_entities()を実行するとどうなりますか。 そのストアドプロシージャに対して?

    調べてみましょう。

    ALTER TABLE [dbo].[Client] 
    DROP COLUMN LastName;
    

    LastNameを削除しました 私のテーブルの列。

    次に、sys.dm_sql_referenced_entities()を実行します もう一度:

    SELECT 
      referenced_schema_name AS [Schema],
      referenced_entity_name AS Entity,
      referenced_minor_name AS Minor,
      referenced_class_desc AS Class,
      is_select_all,
      is_all_columns_found
    FROM sys.dm_sql_referenced_entities (
        'dbo.uspGetClient', 
        'OBJECT');
    

    結果:

    Msg 207, Level 16, State 1, Procedure uspGetClient, Line 4
    Invalid column name 'LastName'.
    Msg 2020, Level 16, State 1, Line 3
    The dependencies reported for entity "dbo.uspGetClient" might not include references to all columns. This is either because the entity references an object that does not exist or because of an error in one or more statements in the entity. Before rerunning the query, ensure that there are no errors in the entity and that all objects referenced by the entity exist.
    

    例4–テーブル全体を削除する

    テーブル全体を削除するとどうなるか見てみましょう。

    DROP TABLE Client;
    

    テーブルが削除されました。

    sys.dm_sql_referenced_entities()を実行します :

    SELECT 
      referenced_schema_name AS [Schema],
      referenced_entity_name AS Entity,
      referenced_minor_name AS Minor,
      referenced_class_desc AS Class,
      is_select_all,
      is_all_columns_found
    FROM sys.dm_sql_referenced_entities (
        'dbo.uspGetClient', 
        'OBJECT');
    

    結果:

    Msg 2020, Level 16, State 1, Line 2
    The dependencies reported for entity "dbo.uspGetClient" might not include references to all columns. This is either because the entity references an object that does not exist or because of an error in one or more statements in the entity. Before rerunning the query, ensure that there are no errors in the entity and that all objects referenced by the entity exist.
    

    例5–すべての列を返す

    Microsoftは、アスタリスク(*)の使用を特に推奨していません。 )動的管理ビューおよび関数(sys.dm_sql_referenced_entities())からすべての列を選択します 1であります)。これは、SQLServerの将来のリリースでスキーマと返されるデータが変更される可能性があるためです。これにより、将来のリリースで列が列リストの最後に追加される可能性があり、すべての列を選択するためにアスタリスクに依存している場合、アプリケーションを混乱させる可能性があります。

    そうは言っても、これを行う例は次のとおりです。アスタリスク(*を使用) )sys.dm_sql_referenced_entities()からすべての列を選択します 。これは、この関数から実際に返される列を示すためにのみ行っています(少なくともSQL Server 2019では)。

    SELECT *
    FROM sys.dm_sql_referenced_entities (
        'dbo.uspGetClient', 
        'OBJECT');
    

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

    -[ RECORD 1 ]-------------------------
    referencing_minor_id     | 0
    referenced_server_name   | NULL
    referenced_database_name | NULL
    referenced_schema_name   | dbo
    referenced_entity_name   | Client
    referenced_minor_name    | NULL
    referenced_id            | 434100587
    referenced_minor_id      | 0
    referenced_class         | 1
    referenced_class_desc    | OBJECT_OR_COLUMN
    is_caller_dependent      | 0
    is_ambiguous             | 0
    is_selected              | 1
    is_updated               | 0
    is_select_all            | 0
    is_all_columns_found     | 1
    is_insert_all            | 0
    is_incomplete            | 0
    -[ RECORD 2 ]-------------------------
    referencing_minor_id     | 0
    referenced_server_name   | NULL
    referenced_database_name | NULL
    referenced_schema_name   | dbo
    referenced_entity_name   | Client
    referenced_minor_name    | ClientCode
    referenced_id            | 434100587
    referenced_minor_id      | 1
    referenced_class         | 1
    referenced_class_desc    | OBJECT_OR_COLUMN
    is_caller_dependent      | 0
    is_ambiguous             | 0
    is_selected              | 1
    is_updated               | 0
    is_select_all            | 0
    is_all_columns_found     | 1
    is_insert_all            | 0
    is_incomplete            | 0
    -[ RECORD 3 ]-------------------------
    referencing_minor_id     | 0
    referenced_server_name   | NULL
    referenced_database_name | NULL
    referenced_schema_name   | dbo
    referenced_entity_name   | Client
    referenced_minor_name    | FirstName
    referenced_id            | 434100587
    referenced_minor_id      | 2
    referenced_class         | 1
    referenced_class_desc    | OBJECT_OR_COLUMN
    is_caller_dependent      | 0
    is_ambiguous             | 0
    is_selected              | 1
    is_updated               | 0
    is_select_all            | 0
    is_all_columns_found     | 1
    is_insert_all            | 0
    is_incomplete            | 0
    -[ RECORD 4 ]-------------------------
    referencing_minor_id     | 0
    referenced_server_name   | NULL
    referenced_database_name | NULL
    referenced_schema_name   | dbo
    referenced_entity_name   | Client
    referenced_minor_name    | LastName
    referenced_id            | 434100587
    referenced_minor_id      | 3
    referenced_class         | 1
    referenced_class_desc    | OBJECT_OR_COLUMN
    is_caller_dependent      | 0
    is_ambiguous             | 0
    is_selected              | 1
    is_updated               | 0
    is_select_all            | 0
    is_all_columns_found     | 1
    is_insert_all            | 0
    is_incomplete            | 0
    -[ RECORD 5 ]-------------------------
    referencing_minor_id     | 0
    referenced_server_name   | NULL
    referenced_database_name | NULL
    referenced_schema_name   | NULL
    referenced_entity_name   | clientcode
    referenced_minor_name    | NULL
    referenced_id            | 257
    referenced_minor_id      | 0
    referenced_class         | 6
    referenced_class_desc    | TYPE
    is_caller_dependent      | 0
    is_ambiguous             | 0
    is_selected              | 0
    is_updated               | 0
    is_select_all            | 0
    is_all_columns_found     | 0
    is_insert_all            | 0
    is_incomplete            | 0
    (5 rows affected)
    

    公式ドキュメント

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


    1. SQLServerトランザクションレプリケーションの内部

    2. SQL Serverでカスケード削除を使用するにはどうすればよいですか?

    3. SQL Server(T-SQL)でデータベースメールの構成設定を変更する方法

    4. クエリの説明プランをどのように解釈しますか?