次の方法で共有


SHOWPLAN 権限と Transact-SQL バッチ

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

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 権限のチェックは行われません。

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

SET SHOWPLAN_XML ON
GO
USE tempdb
SELECT * FROM AdventureWorks.Person.Address
USE master
SELECT * FROM AdventureWorks.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 ステートメントでは、AdventureWorks データベース上で SHOWPLAN 権限がチェックされます。EXEC ステートメント自体、tempdb データベース、または master データベースでは SHOWPLAN 権限のチェックは行われません。

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

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

SET STATISTICS XML ON
GO
USE tempdb
EXEC ('USE master; SELECT * FROM AdventureWorks.Person.Address');
ms178086.note(ja-jp,SQL.90).gifメモ :
以前のバージョンの SQL Server を参照するクエリでは、SHOWPLAN 権限がチェックされません。ただし、このようなクエリの SQL Server 2005 で実行される部分では、SHOWPLAN 権限がチェックされます。

エラーを含むバッチ

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

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

参照

概念

プラン表示のセキュリティ

ヘルプおよび情報

SQL Server 2005 の参考資料の入手