EXECUTE権限がオブジェクト 'xxxxxxx'、データベース 'zzzzzzz'、スキーマ 'dbo'で拒否されました


187

関数の実行に問題があります。

これが私がしたことです:

  1. SQL Server Management Studioを使用して関数を作成します。正常に作成されました。
  2. 次に、新しく作成した関数を実行してみましたが、次のものが得られます。

EXECUTE権限は、オブジェクト「xxxxxxx」、データベース「zzzzzzz」、スキーマ「dbo」で拒否されました。


db_ownerロールを持っている場合、ユーザーは実行することもできます(Grant execと同じではありません...)
hazjack

SQLステートメントに構文エラーがあると、このエラーが発生しました。本質的に私はマージしGOてにCreate入れていましたGOCreate。他の構文エラーもこのエラーを与えるようです。
Ganesh Kamath-'Code Frenzy'

回答:


163

問題のストアドプロシージャの実行権限をユーザー(またはユーザーが属しているグループ)に付与する必要があるようです。

例えば、あなたは可能性がこのようにアクセス権を付与します。

USE zzzzzzz;
GRANT EXEC ON dbo.xxxxxxx TO PUBLIC

2
こんにちは、少し前のことですが、質問があります。このようなアクションにはセキュリティ上の問題があるのでしょうか?誰でも使えるようにspを開きますか?
Valentyn Vynogradskiy 14

9
はい、DBに接続しているすべてのユーザーがストアドプロシージャを実行できます。セキュリティを心配している人データベースの関連グループへのアクセスを許可することを期待ます
Rowland Shaw

7
を使用GRANT EXEC TO PUBLICして、データベース内のすべてのオブジェクトへのアクセスを許可することもできます
sohaiby

2
私はpublicロールに実行権限を決して与えません。私たちの環境では、公共の役割を無効にすることが義務付けられていました。私は常に、この目的のために明示的に作成された特定のユーザーまたはロールに実行権限を付与します。
user1161391 2017年

4
なぜ誰もがコメントを支持して、データベースで何かを実行するためのパブリック権限を与えることを提案しているのですか?それは事実ではない特別なケースです。
2018

111

私が見つけた最良の解決策は、新しいデータベースの役割を作成することです。

CREATE ROLE db_executor;

次に、その役割にexec権限を付与します。

GRANT EXECUTE TO db_executor;

ユーザーのプロパティに移動してユーザーマッピングに移動し、新しいロールを追加したデータベースを選択すると、新しいロールが次のデータベースロールメンバーシップに表示されます。

詳細については、記事全体をお読みください


8
この回答は、publicまたはdb_ownerを使用せずに、特定のユーザーログインにすべてのSPのEXECUTEを付与する必要がある場合に最適です。ここで最も賢明で有用な答えのようです。
jcollum

1
何らかの理由で、これがSQL Server 2012で機能する唯一の答えです。ユーザーに明示的なEXECUTE権限を付与しても機能しません。ロールを介して権限を継承する場合にのみ機能します。
キース

1
これが答えです。それは私にとって魅力のように働きました。どうもありがとう!
Shahbaaz

その後のようなアカウントに追加EXEC sp_addrolemember @rolename = N'db_executor', @membername = N'processAPI'
ΩmegaMan

72

SQL Server Management Studioで:

に行くだけsecurity->schema->dbo

ダブルクリックしDBO、その後、上のクリックpermission tab->(blue font)view database permissionなどで必要なフィールドにスクロールして自由に感じる"execute".使用して選択するのヘルプあなた自身grantまたはdenyコントロール。これが役立つことを願っています:)


52

あなたはこのようなものを実行する必要があります

GRANT Execute ON [dbo].fnc_whatEver TO [domain\user]

4
これは私が必要とするものでしたが、私は[domain\user]むしろそうしなければなりませんでした'domain\user'
Paul Stephenson

45

これは、ユーザーまたはロールに権限を付与しようとしている場合に機能します。

Microsoft SQL Server Management Studioの使用:

  1. 移動:データベース
  2. dbo.my_databaseを右クリックします
  3. 選択:プロパティ
  4. 左側のパネルで、次をクリックします:権限
  5. ユーザーまたはロールを選択し、名前パネルで
  6. アクセス許可とチェックマークで実行場所を見つけます:許可、許可あり、または拒否

残念ながら、ユーザーはすでに実行権限を持っています!これがそう....混乱している理由である
ダグラスガスケル

キームに感謝します。これは、Grantにチェックマークを付けると完全に機能します
Rosh

16

特にWebアプリケーションが同じユーザー名を使用している場合、そのような許可を与えることは危険な場合があります。

これで、Webユーザー(およびワールドワイドウェブ全体)は、データベース内でオブジェクトを作成およびドロップする権限も持っています。SQLインジェクションを考えてください!

次のように、指定されたオブジェクトの特定のユーザーにのみ実行権限を付与することをお勧めします。

grant execute on storedProcedureNameNoquotes to myusernameNoquotes

これで、ユーザーmyusernameNoquotesは、貴重なデータに対する他の不要な権限なしでプロシージャstoredProcedureNameNoquotesを実行できます。



3

ソリューションの実行時にスローされた例外に関して上記の質問のような問題がある場合、問題は権限であり、そのグループのユーザーにデータベース/ストアドプロシージャにアクセスする権限が適切に付与されていません。あなたがする必要があるのは、私があなたのデータベース名、ストアドプロシージャ(関数)、およびアクセス許可または役割のタイプ、またはあなたがアクセスを許可している人で私のものを置き換える、以下のようなことをすることです。

USE [StableEmployee]
GO
GRANT EXEC ON dbo.GetAllEmployees TO PUBLIC

/ ******オブジェクト:StoredProcedure [dbo]。[GetAllEmployees]スクリプト日付:01/27/2016 16:27:27 ****** /

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[GetAllEmployees]
as
Begin
Select EmployeeId, Name, Gender, City, DepartmentId
From tblEmployee

End

2

全員に実行権限を与えることができます:

GRANT Execute on [dbo].your_object to [public]

「パブリック」は、すべてのユーザーがメンバーとなっているデフォルトのデータベースロールです。


1

同じ問題に直面し、データベースユーザーにもdb_owner権限を与えることで解決しました。


11
私はこれが良い解決策だとは思いません... Webアプリケーションにこの許可を与えることができないので..誰がこれに投票したかわかりません
ミナガブリエル

7
これは非常に安全ではないため、推奨されません。あなたは適切な役割の代わりに、データベース全体を完全に制御を持っているのdb_ownerを使用して作成する必要があります
Yetiish

1

このユーザーを特定のデータベースに対して特別なものにする場合は、プロパティの「ユーザーマッピング」でdb_ownerとして設定しないでください。


1

セキュリティ特権のために設計されたサーバーの役割を変更する方がよいでしょう。ユーザーにsysadminサーバーロールを追加します。セキュリティを向上させるために、カスタムサーバーの役割を持たせることができます。しかし、このアプローチは今あなたが望むものをあなたに与えるでしょう。

  1. オブジェクトエクスプローラー->サーバー->セキュリティ->ログイン
  2. 目的のユーザーを右クリックします
  3. 左側のサーバーの役割に移動します
  4. sysadminがチェックされていることを確認してください
  5. [OK]をクリックして、SQLサーバーを再起動します

幸運を

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


1
システム管理者は、総やり過ぎ(危険)である
Trubs

0

ここでは、非公開の1人のユーザーに許可を与える方法を示します。

直接クエリ:

Use MyDatabase Grant execute on [dbo].[My-procedures-name] to [IIS APPPOOL\my-iis-pool] Go

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.