web-dev-qa-db-ja.com

単一のストアドプロシージャの実行権限をどのように付与しますか?

通常、ストアドプロシージャを作成するときは、次のようなテンプレートを使用します。

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
43
DaneEdw
GRANT EXECUTE ON dbo.procname TO username;
69
Levi W

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には、テーブルを変更したり、このテーブルのデータを読み取ったり変更したりする権限が絶対にありません。

このプロシージャのコンテキスト内でコーディングされたこの特定のタスクを完了するために必要な権限のみを取得します。

これらの権限を永続的に割り当てることなく、高度なセキュリティ権限を必要とするタスクを実行できるストアドプロシージャを作成するこの方法は、非常に役立ちます。

10
Richard Ouimet

enter image description here

データベースログインを選択します。--> [セキュリティ保護可能に移動]をクリックし、前の図のように[検索]ボタンをクリックします。 [検索]ボタンをクリックすると、オブジェクトのタイプを追加するための次のウィンドウが表示されます。

[オブジェクトタイプ]ボタンをクリックすると、さまざまなオブジェクトを含む[オブジェクトタイプの選択]ウィンドウが表示されます。表示されている場合、ストアドプロシージャがオブジェクトタイプ領域にリストされています。次に、アクセス許可を付与する特定のストアドプロシージャを選択します。

5
arnav