EXECUTE AS の使用によるカスタム権限セットの作成

モジュールの実行コンテキストを指定すると、カスタム権限セットを定義するときに非常に役立ちます。たとえば、TRUNCATE TABLE など、許可する権限のない操作があります。TRUNCATE TABLE を実行するには、指定されたテーブルの ALTER 権限がユーザーに許可されている必要があります。ところが場合によっては、テーブルの ALTER 権限をユーザーに許可することは望ましくありません。これは、実質的にはテーブルの切り捨て以外の操作も実行できる権限をそのユーザーに許可することになるためです。

TRUNCATE TABLE ステートメントをモジュール内に組み込み、テーブルを変更する権限が許可されているユーザーとしてそのモジュールを実行するように指定すると、テーブルの切り捨てを行うための権限を、そのモジュールの EXECUTE 権限が許可されたユーザーに拡張できます。

次のストアド プロシージャについて考えてみましょう。

CREATE PROCEDURE TruncateMyTable
WITH EXECUTE AS SELF
AS TRUNCATE TABLE MyDB..MyTable;

CREATE PROCEDURE TruncateMyTable
WITH EXECUTE AS SELF
AS TRUNCATE TABLE MyDB..MyTable;

Mary がこのプロシージャを作成し、TruncateMyTable の実行権限を Scott に許可するとします。Scott がこのストアド プロシージャを実行すると、データベース エンジンでは Mary がストアド プロシージャを実行したかのように、テーブルの切り捨てを行う権限が確認されます。Mary はテーブルの所有者なので、Scott がテーブルに直接アクセスできる権限を持っていなくてもステートメントは成功します。Mary は、作業の実行に必要な権限よりも多くの権限を許可することなく、迅速かつ効果的に目的の権限を Scott に拡張しました。