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


40

通常、ストアドプロシージャを作成するときは、並べ替えのテンプレートとして次を使用します。

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

編集されたテキストで提供されるコードは有効であり、この質問に対する正しい答えです。
ninty9notout

回答:



10

テーブルの切り捨てストアドプロシージャなどのオブジェクトに対するアクセス許可の設定は、次の方法で実行できます。

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

この手順のコンテキスト内でコーディングされたこの特定のタスクを完了するために必要な権利のみを引き継ぎます。

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


4
これは、昨日SOに投稿したのと同じ答えで、読みやすくするためにフォーマットする必要がありました。
アーロンバートランド

5

ここに画像の説明を入力してください

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

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


最初に、あなたが答えたとき、質問は5歳以上でした。OPが、GUIを使用せず、スクリプトに埋め込むことができるソリューションを具体的に要求した場合を除き、それは問題ありません。あなたの応答はそれを解決しません。
エリックブラント
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.