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

SQL Serverで参照エンティティを検索します:sys.dm_sql_referencing_entities()

    SQL Serverでは、sys.dm_sql_referencing_entities()を使用できます。 別のユーザー定義エンティティを名前で参照する現在のデータベース内のすべてのエンティティのリストを取得するシステム動的管理機能。

    つまり、指定されたエンティティに依存するエンティティのリストを返します。

    具体的には、指定されたエンティティを参照する現在のデータベース内の次のエンティティタイプについてレポートします。

    • スキーマにバインドされたエンティティまたはスキーマにバインドされていないエンティティ
    • データベースレベルのDDLトリガー
    • サーバーレベルのDDLトリガー

    構文

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

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

    例1-基本的な例

    使用法の基本的な例は次のとおりです。

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

    結果:

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

    この例では、「WideWorldImporters」データベースの「Application.Cities」を参照する6つのエンティティがあります。

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

    したがって、前のコードは次のように書き直す必要があります。

    例:

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

    もちろん、必要に応じて、いつでもより少ない列を指定できます。

    例2–参照エンティティタイプを取得する

    上記の例はすべて問題ありませんが、参照元のタイプはわかりません。つまり、ビューなのか、ストアドプロシージャなのか、わかりません。

    この情報は、sys.dm_sql_referencing_entities()に参加することで取得できます。 sys.objectsを使用 。

    したがって、前の例を次のように変更できます:

    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;  
    

    結果:

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

    例3–ユーザー定義タイプ

    sys.dm_sql_referencing_entities()の使用例を次に示します。 特定のユーザー定義のエイリアスタイプを参照するエンティティを返します。

    この例では、clientcodeというユーザー定義のエイリアスを作成しました 。次に、それを2つの列(2つの異なるテーブル)で使用し、タイプを名前で参照するストアドプロシージャも作成しました(@ClientCodeという引数を受け入れます)。 これはclientcodeのものです タイプ)。

    ユーザー定義の型を返すには、TYPEを使用します 2番目の引数として。

    例:

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

    結果:

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

    名前から、これらは両方ともストアドプロシージャであることがわかります(どちらもuspというプレフィックスが付いています 、これはユーザー定義のストアドプロシージャを作成する際の一般的な規則です)が、sys.objectsを確認することでこれを確認できます。 システムカタログビューをもう一度:

    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;  
    

    結果:

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

    このエイリアスタイプは、このデータベースの2つのテーブルの列で使用されていることに注意してください。ただし、ユーザー定義型が計算列の定義CHECKに含まれていないため、これらは依存関係のリストには表示されません。 制約、またはDEFAULT テーブルの制約。

    また、テーブルの1つは、dbo.clientcodeを使用する列の外部キー制約を介して他のテーブルを参照します。 ユーザー定義のタイプですが、これもリストに表示されません。

    公式ドキュメント

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


    1. WordPressでHHVMを使用する

    2. alembicutilコマンドエラーで識別子が見つかりません

    3. パフォーマンスの神話:クラスター化インデックスと非クラスター化インデックス

    4. デフォルトのトレースの削除–パート3