質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Q&A

解決済

1回答

5339閲覧

MSSQLSERVER2014 でストアドの実行権限のみ付与したい。

Com

総合スコア30

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

0グッド

0クリップ

投稿2021/10/06 01:14

MSSQLSERVER に、ログインユーザー太郎を作成して
ストアドZZZ に実行権限を渡したいので、
ストアドZZZを右クリック⇒プロパティ⇒権限⇒ユーザー太郎を選択⇒実行の許可にチェック(権限の許可者dbo)
として、ストアドを実行します。

ストアドの内容がシンプルなSELECT文だと問題ないのですが
(例:こういうやつ)

ストアドZZZ AS select * from tableBBB where 1=1

ストアドの中に動的SQLを書いてEXECで実行するとエラーになります。
(例:こういうやつ)

ストアドZZZ AS declare @sql nvarchar(max) = ''; set @sql += ' select *'; set @sql += ' from tableBBB'; IF 条件 BEGIN set @sql += ' where 1=1'; END ELSE BEGIN  set @sql += ' where 2=2'; END EXEC(@sql);

エラー:
SELECT 権限がオブジェクト 'tableBBB'、データベース 'DB名'、スキーマ 'dbo' で拒否されました。

これって、tableBBBテーブルの参照権限にユーザー太郎を許可するしかないのでしょうか?
できれば、ストアド以外の権限は付けたくないのです。

何卒よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/10/08 09:33

質問者さん、その後無言ですが、どうして EXECUTE を使うと対象テーブルに SELECT 権限を与える必要があるのかは Microsoft のドキュメントで説明しました。このスレッドはクローズしてください。まだ質問があるならそれを書いてください。オープンしておきたい理由があればその旨書いてください。とにかく無言で放置は NG です
guest

回答1

0

ベストアンサー

検証したわけではないのでハズレかもしれませんが・・・

SSMS を操作して「ログインユーザー太郎」に当該ストアドプロシージャに対する「実行」権限を与えたらどうなりますか?

イメージ説明

ハズレだったらすみません。

【追記】

下のコメント欄の 2021/10/06 12:58 の私のコメントで「自分の環境でやってみましたが、ストアドの実行権限を与えるだけではダメで、当該テーブルの SELECT 権限も必要という結果でした。詳しくは後で回答欄に追記しておきます」と書いた件です。

Windows 10 Pro 64-bit にインストールした SQL Server 2012 の以下の画像の Student テーブルで試してみました。

イメージ説明

権限を与えるのは IIS のワーカープロセスのアカウントにした NETWORK SERVICE にしましたので、Student テーブルのあるデータベース TestDatabase のログインに NETWORK SERVICE を追加。

イメージ説明

ストアドプロシージャを作成。

イメージ説明

NETWORK SERVICE にストアドプロシージャの実行権限を付与。これだけでは「SELECT 権限がオブジェクト・・・」というエラーになります。

イメージ説明

エラーメッセージは SELECT 権限がないと言っているので、NETWORK SERVICE に Student テーブルに対する SELECT 権限を与えます。

イメージ説明

以上でエラーは解消します。実行結果は以下の通りです。

イメージ説明

お試しください。

【追記2】

下のコメント欄の 2021/10/08 06:54 の私のコメントで「文書見つかりました。後で解答欄に書いておきます」と書いた件です。

どうして EXECUTE を使うと対象テーブルにSELECT権限を与える必要があるのかですが、そういう仕様だということのようです。以下の記事を見てください。

アクセス許可
https://docs.microsoft.com/ja-jp/sql/t-sql/language-elements/execute-transact-sql?view=sql-server-ver15#permissions

抜粋: "EXECUTE ステートメントの実行に権限は必要ありませんが、 EXECUTE 文字列内で参照されるセキュリティ保護可能なリソースに対しては権限が必要です。 たとえば、この文字列に INSERT ステートメントが含まれている場合、EXECUTE ステートメントの呼び出し元は対象のテーブルに対する INSERT 権限が必要です。"

仕様ということらしいので、ストアドに EXECUTE を使う今回の質問の例の場合、ユーザーには対象テーブルに対する SELECT 権限も与える以外に解決策はなさそうです。

(上の「EXECUTE ステートメントの実行に権限は必要ありませんが」というのはストアドの「実行」権限の話ではありませんので注意してください。ストアドの「実行」権限はストアド内に EXECUTE ステートメントを使う/使わないにかかわらず、ユーザーに与える必要があります)

投稿2021/10/06 01:31

編集2021/10/08 00:26
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Com

2021/10/06 01:42

ご回答ありがとうございます。 はい。まさしくその作業が冒頭に書いている ストアドZZZを右クリック⇒プロパティ⇒権限⇒ユーザー太郎を選択⇒実行の許可にチェック(権限の許可者dbo) の内容になります。 キャプチャありがとうございます!
退会済みユーザー

退会済みユーザー

2021/10/06 01:56

> はい。まさしくその作業が冒頭に書いているストアドZZZを右クリック⇒プロパティ⇒権限⇒ユーザー太郎を選択⇒実行の許可にチェック(権限の許可者dbo)の内容になります。 そうだったのですか。余計な回答内容だったようですみません。
Com

2021/10/06 02:05

ありがとうございます。 また、よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2021/10/06 03:58

自分の環境でやってみましたが、ストアドの実行権限を与えるだけではダメで、当該テーブルの SELECT 権限も必要という結果でした。詳しくは後で回答欄に追記しておきます。
Com

2021/10/06 04:09

なんと。。。 ご確認いただきまして誠にありがとうございます!
Com

2021/10/06 07:12

ありがとうございます! すごく丁寧にご解説いただきまして感謝です。 やはり対象テーブルにSELECT権限を与える必要があるのですね。。。(泣)
退会済みユーザー

退会済みユーザー

2021/10/06 08:46

> やはり対象テーブルにSELECT権限を与える必要があるのですね。。。(泣) 自分がいろいろ試した限りではそれ以外に解決できる方法は無かったです。どうして EXECUTE を使うとダメなのか、公式文書は見つけられていませんが・・・
退会済みユーザー

退会済みユーザー

2021/10/07 21:54

文書見つかりました。後で解答欄に書いておきます。
Com

2021/10/27 03:07

その分析力に感嘆いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問