通常、ストアドプロシージャを作成するときは、以下を並べ替えのテンプレートとして使用します
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;
回答
テーブルの切り捨てストアドプロシージャなどのオブジェクトに対する権限の設定は、次の方法で実行できます。
GRANT EXECUTE ON <schema>.<object> to <user>;
ただし、次の場所でセキュリティ権限を付与することもできます。ログインレベルとユーザーレベルの両方。アクセスが必要なオブジェクト(実行など)に必要な権限のみを決定して付与する必要があります。 EXECUTE AS
機能の使用を検討してください。これにより、別のユーザーになりすまして、基になるすべてのオブジェクトに必要なすべての権限を付与することなく、コードの実行に必要な権限を検証できます(例:テーブル)。 EXECUTE AS
は、ストアドプロシージャ、関数、トリガーなどに追加できます。
ストアドプロシージャ内で次のようにコードに追加します。
CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER
この場合、呼び出されているモジュールの所有者になりすましています。また、SELFになりすます、またはモジュールを作成または変更するユーザーになりすます、または…モジュールが現在のユーザーの権限を引き継ぐことを可能にするCALLERを偽装する、または… OWNERになりすまして呼び出されるプロシージャの所有者OR …特定のユーザーになりすます「user_name」になりすますOR …「login_name」になりすますと特定のログインになりすます
ほとんどの場合、保存されたプロシージャにEXECUTE
権限を付与するだけで、格納されたプロシージャ内で参照されるすべてのオブジェクトに権限が付与されます。
このように、権限を付与する必要はありません。暗黙の権限を付与します(例:データを更新するか、追加のプロシージャを呼び出す)。所有権の連鎖がこれを処理します。これは、動的SQLの場合、またはCREATE TABLE
などの高度なセキュリティタスクを作成する必要がある場合に特に役立ちます。 EXECUTE AS
は、これらを検討するのに便利なツールです。
この例は、これらすべてを明確にするのに役立ちます。
NoPrivUserというユーザーを次のように作成します。データベース(dbadbなど)へのパブリックアクセス:
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
には、テーブルを変更したり、このテーブルのデータを読み取ったり変更したりする権限がまったく付与されていません。
必要なのはこのプロシージャのコンテキスト内でコーディングされたこの特定のタスクを完了するために必要な権限について。
これらの権限を永続的に割り当てることなく、高度なセキュリティ権限を必要とするタスクを実行できるストアドプロシージャを作成するこの方法は非常に便利です。
コメント
- これは昨日SOに投稿したのと同じ回答です。また、読みやすくするためにフォーマットする必要がありました。
回答
データベースログインを選択-> [セキュリティ保護可能]に移動し、前の画像のように[検索]ボタンをクリックします。 [検索]ボタンをクリックすると、オブジェクトの種類を追加するための次のウィンドウが表示されます。
[オブジェクトの種類]ボタンをクリックすると、さまざまなオブジェクトを含む[オブジェクトの種類の選択]ウィンドウが表示されます。表示されている場合は、ストアドプロシージャがオブジェクトタイプ領域に一覧表示されています。次に、許可を与える特定のストアドプロシージャを選択します。
コメント
- まず、質問に答えたとき、その質問は5年以上前のものでした。 ' GUIを使用せず、スクリプトに埋め込むことができるソリューションをOPが特に要求した場合を除いて、これで問題ありません。 あなたの回答はそれに対処していません。