テーブルの切り捨てストアドプロシージャなどのオブジェクトに対するアクセス許可の設定は、次の方法で実行できます。
GRANT EXECUTE ON <schema>.<object> to <user>;
ただし、ログインレベルとユーザーレベルの両方でセキュリティ権限を付与することもできます。アクセスを必要とするオブジェクト(実行など)に必要な権限のみを決定して付与する必要があります。EXECUTE AS
他のユーザーになりすまして、コードを実行するために必要な権限を検証できる機能を使用することを検討してください。EXECUTE AS
ストアドプロシージャ、関数、トリガーなどに追加できます。
ストアドプロシージャ内で次のようにコードを追加します。
CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER
この場合、呼び出されるモジュールの所有者になりすましています。また、SELFを偽装するか、ユーザーがモジュールを作成または変更するか、... CALLERを無効にします。これにより、モジュールが現在のユーザーの権限を取得できるようになります。呼び出されるプロシージャの所有者OR ...特定のユーザーを偽装する「user_name」を偽装するか、特定のログインを偽装する「login_name」を偽装します。
EXECUTE
ほとんどの場合、ストアドプロシージャに権限を付与するだけでよく、その後、ストアドプロシージャ内で参照されるすべてのオブジェクトに権限が付与されます。
このように、暗黙的な権限を与える必要はありません(例:データを更新するか、追加のprocを呼び出す)。所有権の連鎖がこれを処理します。これは、動的SQLの場合や、などの高度なセキュリティタスクを作成する必要がある場合に特に役立ちますCREATE TABLE
。EXECUTE AS
これらを考慮するのに便利なツールです。
この例は、このすべてを明確にするのに役立ちます。
データベース(dbadbなど)にパブリックアクセスできるNoPrivUserというユーザーを作成します。
USE [master];
GO
CREATE LOGIN [NoPrivUser] WITH PASSWORD=N'ABC5%', DEFAULT_DATABASE=[dbadb],
CHECK_EXPIRATION=ON, CHECK_POLICY=ON;
GO
USE [DBAdb];
GO
CREATE USER [NoPrivUser] FOR LOGIN [NoPrivUser];
GO
注:この手順の作成者または所有者は、ターゲットデータベース内にテーブルの権利を作成する必要があります。
use DBAdb
go
CREATE PROCEDURE dbo.MyProcedure
WITH EXECUTE AS OWNER
truncate table MyTable
GO
GRANT EXEC ON dbo.MyProcedure TO NoPrivUser;
GO
-- Now log into your database server as NoPrivUser and run the following.
このEXECUTE AS
句を使用すると、ストアドプロシージャはオブジェクト所有者のコンテキストで実行されます。このコードは正常に作成されdbo.MyTable
、行が正常に挿入されます。この例では、ユーザーNoPrivUser
はテーブルを変更したり、このテーブルのデータを読み取ったり変更したりする権限を絶対に付与されていません。
この手順のコンテキスト内でコーディングされたこの特定のタスクを完了するために必要な権利のみを引き継ぎます。
高度なセキュリティ権限を必要とするタスクを、それらの権限を永続的に割り当てることなく実行できるストアドプロシージャを作成するこの方法は、非常に便利です。