通常、ストアドプロシージャを作成するときは、次のようなテンプレートを使用します。
Create procedure <procedurename>
<@param1 <type>, @param2 <type>, etc..>
as begin
<procedure>
end
私がそれにいる間、そのストアドプロシージャのみに実行権限を付与することを含める方法はありますか?
たとえば...
Grant execute [User_Execute]
...しかし、このストアドプロシージャのみですか?
他のいくつかの同様の質問を見たことがありますが、それらはすべて1つだけでなくすべてのストアドプロシージャを参照しているようです。また、create procedure
スクリプト内でアクセス許可を指定できる質問もありません。特定のストアドプロシージャのGUIなしでアクセス許可を設定する方法についての回答も歓迎します。
編集する 一番上の答えは確かに正しい方向に私を向けました、これは本質的に私が探していたものです、私がやったことであるコマンドをバッチ処理すること、私がストアドプロシージャと一緒にコマンドをバッチ処理することについては考えませんでした。とにかく、かなり滑らかだと思います。
Create procedure <procedurename>
<@param1 <type>, @param2 <type>, etc..>
as begin
<procedure>
end
GO
GRANT EXECUTE ON <procedurename> to <username>
GO
GRANT EXECUTE ON dbo.procname TO username;
truncate tableストアドプロシージャなどのオブジェクトに対する権限の設定は、次の方法で実行できます。
GRANT EXECUTE ON <schema>.<object> to <user>;
ただし、ログインレベルとユーザーレベルの両方でセキュリティ権限を付与することもできます。アクセスを必要とするオブジェクト(実行など)に必要な権限のみを決定して付与します。 EXECUTE AS
機能の使用を検討してください。これにより、他のユーザーのなりすましが原因で、基になるすべてのオブジェクト(テーブルなど)に必要なすべての権限を付与する必要なしに、コードを実行するために必要な権限を検証できます。 EXECUTE AS
は、ストアドプロシージャ、関数、トリガーなどに追加できます。
ストアドプロシージャ内で次のようにコードに追加します。
CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER
この場合、呼び出されているモジュールの所有者に成り代わっています。 ORユーザーがモジュールを作成または変更するOR ... CALLERを偽装することもできます。これにより、モジュールが現在のユーザーの権限を取得できるようになります。またはOWNERを偽装します。呼び出されるプロシージャの所有者の許可を取得しますOR ...偽装 'user_name'は特定のユーザーを偽装しますOR ...偽装 'login_name'は特定のログインを偽装します.
ほとんどの場合、EXECUTE
権限をストアドプロシージャに付与するだけで、ストアドプロシージャ内で参照されるすべてのオブジェクトに権限が付与されます。
このようにして、暗黙の権限を付与する必要はありません(例:データを更新するか、追加のプロシージャを呼び出す)。所有権の連鎖がこれを処理します。これは、動的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
注:作成者ORこの手順の所有者は、ターゲットデータベース内にテーブル権限を作成する必要があります。
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
には、テーブルを変更したり、このテーブルのデータを読み取ったり変更したりする権限が絶対にありません。
このプロシージャのコンテキスト内でコーディングされたこの特定のタスクを完了するために必要な権限のみを取得します。
これらの権限を永続的に割り当てることなく、高度なセキュリティ権限を必要とするタスクを実行できるストアドプロシージャを作成するこの方法は、非常に役立ちます。