SHOWPLAN 権限と Transact-SQL バッチ

Transact-SQL バッチは、1 つまたは複数のステートメントで構成されています。このトピックでは、Transact-SQL バッチでさまざまなプラン表示 SET ステートメント オプションを使用する場合に、SQL Server によってステートメント オプションに対する SHOWPLAN 権限がどのように確認されるかについて説明します。

セキュリティに関する注意セキュリティに関する注意

SHOWPLAN 権限、ALTER TRACE 権限、または VIEW SERVER STATE 権限を持つユーザーは、プラン表示出力にキャプチャされたクエリを表示できます。これらのクエリには、パスワードなどの機密情報が含まれている場合があります。したがって、これらの権限は、機密情報を表示することが認められているユーザー (たとえば db_owner 固定データベース ロールのメンバーや sysadmin 固定サーバー ロールのメンバー) のみに付与することをお勧めします。また、プラン表示ファイルまたはプラン表示関連のイベントを含むトレース ファイルのみを保存すること、保存先は NTFS ファイル システムが使用されている場所とすること、および機密情報を表示する権限を持つユーザーのみにアクセスを制限することをお勧めします。

USE または SET ステートメントを含むバッチ

USE または SET ステートメントでは、プラン表示 SET オプション (SHOWPLAN_TEXT、SHOWPLAN_ALL、SHOWPLAN_XML、STATISTICS PROFILE、または STATISTICS XML) に対する SHOWPLAN 権限のチェックは実行されません。推定実行プラン出力を生成する SHOWPLAN_TEXT、SHOWPLAN_ALL、および SHOWPLAN_XML では、これらのプラン表示 SET オプションに対して実行される USE database_name ステートメントを除き、バッチ内で実行される Transact-SQL ステートメントはありません。

SHOWPLAN 権限チェックの例

コンテキスト データベースは、USE database_name ステートメントを使用してバッチ内で設定されます。Transact-SQL ステートメントで参照されるテーブルやビューなどのオブジェクトを含むデータベースでは、SHOWPLAN 権限の有無がチェックされます。ただし、Transact-SQL ステートメントでコンテキスト データベース内のオブジェクトが参照されるまで、コンテキスト データベースでは SHOWPLAN 権限のチェックが実行されません。

バッチに USE database_name ステートメントが含まれている場合、コンテキスト データベースは変化します。この場合、バッチで特定のステートメントが実行されたときに、有効なコンテキスト データベースでの SHOWPLAN 権限のチェックは行われません。

たとえば、次のバッチの場合、両方の SELECT ステートメントで AdventureWorks2008R2 データベースに対する SHOWPLAN 権限がチェックされます。USE ステートメントで参照される master データベースまたは tempdb データベースに対しては、いずれも SHOWPLAN 権限のチェックが実行されません。

SET SHOWPLAN_XML ON
GO
USE tempdb
SELECT * FROM AdventureWorks2008R2.Person.Address
USE master
SELECT * FROM AdventureWorks2008R2.Person.Address
GO

SET SHOWPLAN_XML ON
GO
USE tempdb
SELECT * FROM AdventureWorks2008R2.Person.Address
USE master
SELECT * FROM AdventureWorks2008R2.Person.Address
GO

動的 SQL 用の SHOWPLAN 権限チェック

  • EXEC (command_string) または EXEC (character_string) の形式の動的 SQL ステートメントでは、埋め込まれた文字列を含むこのステートメントに対する SHOWPLAN 権限のチェックは行われません。

  • EXEC dbo.my_stored_procedure の形式のストアド プロシージャを実行する動的 SQL ステートメントでは、EXEC ステートメント自体に対する SHOWPLAN 権限のチェックは行われません。ただし、ストアド プロシージャの本文全体に対してプラン表示が作成されるため、このストアド プロシージャ内のステートメントによって参照されるオブジェクトを含むデータベースでは SHOWPLAN 権限のチェックが実行されます。

次の例は、動的 SQL ステートメントに対して SHOWPLAN 権限をチェックする方法を示しています。SELECT ステートメントでは、AdventureWorks2008R2 データベースの SHOWPLAN 権限がチェックされます。EXEC ステートメント自体では、tempdb データベースまたは master データベースの SHOWPLAN 権限のチェックは行われません。

SET SHOWPLAN_XML ON
GO
USE tempdb
EXEC ('USE master; SELECT * FROM AdventureWorks2008R2.Person.Address');

SET SHOWPLAN_XML ON
GO
USE tempdb
EXEC ('USE master; SELECT * FROM AdventureWorks2008R2.Person.Address');

次の例では、SET STATISTICS XML が使用されており、バッチが master データベースに送信された場合、SET ステートメントで SHOWPLAN 権限のチェックが実行されません。SHOWPLAN 権限は USE tempdb ステートメントでチェックされません。ただし、CONNECT 権限が USE ステートメントに対してチェックされるため、ユーザーは tempdb データベースの既存のユーザーで、tempdb データベースに対する CONNECT 権限を持っている必要があります。EXEC ステートメントでは SHOWPLAN 権限のチェックが行われません。これは、このステートメントによってプラン表示出力が生成されないためです。SHOWPLAN 権限は USE master ステートメントでチェックされません。ただし、SELECT ステートメントでは、AdventureWorks2008R2 データベースの SHOWPLAN 権限がチェックされます。

SET STATISTICS XML ON
GO
USE tempdb
EXEC ('USE master; SELECT * FROM AdventureWorks2008R2.Person.Address');

SET STATISTICS XML ON
GO
USE tempdb
EXEC ('USE master; SELECT * FROM AdventureWorks2008R2.Person.Address');
注意

以前のバージョンの SQL Server を参照するクエリでは、SHOWPLAN 権限がチェックされません。ただし、このようなクエリの SQL Server 2005 以降で実行される部分では、SHOWPLAN 権限がチェックされます。

エラーを含むバッチ

プラン表示 SET ステートメント オプションが Transact-SQL バッチで使用され、そのバッチでステートメント実行エラーまたは権限チェック エラーが発生した場合、使用した SET オプション モードに応じて、コンテキスト データベースが次のように決定されます。

  • SHOWPLAN_TEXT、SHOWPLAN_ALL、および SHOWPLAN_XML

    バッチの実行が開始される前に有効だったコンテキスト データベースが引き続き有効になります。ステートメント実行エラーまたは権限チェック エラーが検出されない場合、バッチ全体に対するプラン表示出力は生成されません。すべての権限チェックおよびステートメントが正常に実行される必要があります。正常に実行されない場合、プラン表示出力は生成されません。

  • STATISTICS PROFILE および STATISTICS XML

    最後のステートメントが正常に実行されたときに有効だったコンテキスト データベースが引き続き有効になります。ステートメントが正常に実行され、権限チェックが成功したバッチ内の各ステートメントに対してプラン表示出力が生成されます。プラン表示出力は、正常に実行されて権限チェックに成功したバッチ内の各ステートメントに対して生成されます。