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サイトで。