モジュールでの EXECUTE AS の使用
EXECUTE AS を使用して、関数、プロシージャ、キュー、およびトリガなどの、ユーザー定義モジュールの実行コンテキストを定義できます。たとえば、実行コンテキストを、モジュールの呼び出し側から、モジュールの所有者や指定したユーザーに切り替えることができます。以前のバージョンの SQL Server では、これらのモジュールは常にモジュールの呼び出し側のコンテキスト内で実行されていました。
モジュールが実行されているコンテキストを指定することにより、モジュールから参照されるオブジェクトに対する権限を検証するために、データベース エンジンが使用するユーザー アカウントを制御できます。これにより、ユーザー定義モジュールとこれらのモジュールによって参照されるオブジェクトとの間に存在するオブジェクト チェーン全体の柔軟性が増し、権限の管理が容易になります。モジュールのユーザーに必要な権限は、モジュール自体を実行する権限のみです。参照されているオブジェクトに対する明示的な権限は必要ありません。モジュールを実行しているユーザーのみが、モジュールからアクセスするオブジェクトに対して権限を持っている必要があります。
EXECUTE AS CALLER
EXECUTE AS CALLER は、モジュールの呼び出し側のコンテキストで、モジュール内のステートメントが実行されることを指定します。
EXECUTE AS CALLER は、次のシナリオで使用します。
モジュール内のステートメントを呼び出しユーザーとして実行する場合。
呼び出しユーザーではなく、モジュール内のステートメントに対する権限チェックを基本とし、所有権の継承だけを利用して、基になるオブジェクトに対する権限チェックを省略する場合。所有権の継承は DML ステートメントにのみ適用されることに注意してください。所有権の継承の詳細については、「所有権の継承」を参照してください。
基になる参照オブジェクトがアプリケーションのユーザーに表示されてもかまわない場合、または所有権が同じユーザーにあるオブジェクトのみを参照しているため、所有権の継承を利用してスキーマを非表示にすることが可能な場合。
SQL Server 2000 の動作を保持する場合。
EXECUTE AS CALLER シナリオ
Mary は、自分が所有していないけれども、SELECT 権限を持つテーブルを参照するストアド プロシージャを作成します。彼女は、次に示すように CREATE PROCEDURE ステートメントで EXECUTE AS CALLER を指定します。
CREATE PROCEDURE AccessTable
WITH EXECUTE AS CALLER
AS SELECT * FROM dbo.SomeTable;
CREATE PROCEDURE AccessTable
WITH EXECUTE AS CALLER
AS SELECT * FROM dbo.SomeTable;
その後、Mary は、ストアド プロシージャに対する EXECUTE 権限を Scott に許可します。Scott がストアド プロシージャを実行すると、データベース エンジンにより、彼 (呼び出し側) がストアド プロシージャを実行する権限を持っているかどうかが確認されます。Scott は EXECUTE 権限を持っていますが、Mary は参照しているテーブルの所有者ではないため、データベース エンジンにより、Scott がテーブルに対して権限を持っているかどうかが確認されます。Scott が権限を持っていない場合、ストアド プロシージャのステートメントは失敗します。
EXECUTE AS user_name
EXECUTE AS user_name は、モジュール内のステートメントが、user_name で指定されたユーザーのコンテキストで実行されることを指定します。
EXECUTE AS user_name は、次のシナリオで使用します。
モジュール内のステートメントを、指定したユーザーのコンテキストで実行する場合。
所有権の継承を利用して、基になるスキーマを非表示にできない場合 (たとえば、所有権が異なるオブジェクトにモジュールがアクセスする場合) に、参照されているオブジェクトに対する権限の許可を回避する場合。
カスタム権限セットを作成する場合。たとえば、通常は特定の権限を許可できない DDL 操作に対して権限を与える場合などです。詳細については、「EXECUTE AS の使用によるカスタム権限セットの作成」を参照してください。
注 モジュールの実行コンテキストとして指定されたユーザーは、そのモジュールの実行コンテキストが変更されるまで削除できません。
EXECUTE AS user_name シナリオ
Mary は、自分が所有していないけれども、SELECT 権限を持つテーブルを参照するストアド プロシージャを作成します。彼女は、次に示すように CREATE PROCEDURE ステートメントで EXECUTE AS 'Mary' を指定します。
CREATE PROCEDURE AccessMyTable
WITH EXECUTE AS 'Mary'
AS SELECT * FROM dbo.MyTable;
CREATE PROCEDURE AccessMyTable
WITH EXECUTE AS 'Mary'
AS SELECT * FROM dbo.MyTable;
Mary は、ストアド プロシージャの EXECUTE 権限を Scott に許可します。Scott がストアド プロシージャを実行すると、データベース エンジンにより、彼がストアド プロシージャを実行する権限を持っているかどうかが確認されます。ただし、参照されているテーブルに対する権限については、Mary が持っているかどうかが確認されます。このシナリオでは、ストアド プロシージャが Mary のコンテキストで実行されており、Mary がテーブル内のデータにアクセスする権限を持っているため、Scott はテーブルに対して直接 SELECT 権限を持っていなくても、プロシージャを使用してデータにアクセスできます。
EXECUTE AS SELF
EXECUTE AS SELF は、EXECUTE AS user_name と同等で、異なるのは指定されるユーザーがモジュールを作成または変更したユーザーであるという点です。
EXECUTE AS SELF は、次のシナリオで使用します。
作成または変更しているモジュールのステートメントを実行するユーザーとして自分自身を指定するための、簡単な方法が必要な場合。
呼び出しユーザーに対してモジュールを作成するアプリケーションがあり、そのモジュールの作成時に、実行コンテキストとして呼び出しユーザーを使用する場合。このシナリオでは、設計時に呼び出しユーザーの名前がわかりません。
EXECUTE AS OWNER
EXECUTE AS OWNER は、モジュールの現在の所有者のコンテキストで、モジュール内のステートメントが実行されることを指定します。モジュールの所有者が指定されていない場合、モジュールのスキーマの所有者が使用されます。
EXECUTE AS OWNER は、次のシナリオで使用します。
- モジュール自体を変更せずに、モジュールの所有者を変更できる場合。つまり、OWNER には実行時のモジュールの所有者が自動的にマップされます。
OWNER はモジュールの明示的な所有者です。明示的な所有者がいない場合は、モジュールが実行されたときのモジュールのスキーマの所有者になります。OWNER は、グループやロールではなく、単一のアカウントである必要があります。モジュールで EXECUTE AS OWNER が指定されていて、明示的な所有者がいる場合、モジュールの所有権をグループまたはロールに変更することはできません。スキーマに EXECUTE AS OWNER を指定しているモジュールが含まれていて、モジュールの明示的な所有者がいない場合、スキーマの所有権をロールまたはグループに変更することはできません。
EXECUTE AS OWNER シナリオ
Mary は、彼女が所有するテーブルを参照するストアド プロシージャを作成します。彼女は、次に示すように CREATE PROCEDURE ステートメントで EXECUTE AS OWNER を指定します。
CREATE PROCEDURE Mary.AccessMyTable
WITH EXECUTE AS OWNER
AS SELECT * FROM Mary.MyTable;
CREATE PROCEDURE Mary.AccessMyTable
WITH EXECUTE AS OWNER
AS SELECT * FROM Mary.MyTable;
Mary は、ストアド プロシージャの EXECUTE 権限を Scott に許可します。Scott がストアド プロシージャを実行すると、データベース エンジンにより、彼がストアド プロシージャを実行する権限を持っているかどうかが確認されます。ただし、ストアド プロシージャの現在の所有者は Mary なので、参照されているテーブルに対する権限については、Mary が持っているかどうかが確認されます。Mary は、会社を退職することになり、ストアド プロシージャとテーブルの所有権を Tom に変更します。所有権が変更された後に Scott がストアド プロシージャを実行しても、OWNER は自動的に Tom にマップされるため、Scott は引き続きプロシージャを使用してデータにアクセスすることができます。