6

私は Sql Server 2008 を使用しており、内部で sp_executesql を使用する proc を持っています。ASP.NET を介して proc を実行すると、次のエラーが発生し続けます。

オブジェクト 'MyTable'、データベース 'MyDatabase'、スキーマ 'dbo' に対する SELECT 権限が拒否されました。

私はこれについて多くの調査を行いましたが、ほとんどの人は、動的クエリの読み取り元のテーブルに対する選択権限を付与する必要があるという事実を指摘しています。さて、私はこれを行いましたが、まだ機能していないようです:

select object_name(major_id) as object,
 user_name(grantee_principal_id) as grantee,
 user_name(grantor_principal_id) as grantor,
 permission_name,
 state_desc
from sys.database_permissions
where major_id = object_id('User') and 
class = 1
結果:
MyTable public dbo SELECT GRANT
MyTable ゲスト dbo SELECT GRANT
MyTable myuser dbo SELECT GRANT
MyTable NT AUTHORITY\NETWORK SERVICE dbo SELECT GRANT

ご覧のとおり、基になるテーブルで選択を許可しようとしてやり過ぎました。動的SQLでMyTableのみを参照するように、procを書き直しました。上記のすべてのユーザーに、procの「実行」権限を付与しました...うまくいきません。

上記の「myuser」は、web.config の接続文字列のユーザー名です。

ここで何か不足していますか?

ありがとう!デイブ

4

2 に答える 2

5

私はそれを考え出した。これに遭遇した他の人のためにこれを投稿してください。

1) まず、自分の dbo ユーザーにログイン名が関連付けられていないことに気付きました。これは、dbo ユーザーの Security/Users フォルダーで dbo ユーザーを右クリックし、[プロパティ] をクリックすると表示されます。グレー表示された領域に、ユーザー名 (dbo) とログイン名 (sa) を入力する必要があります。これは通常、データベースなどを復元するときに発生すると思います(わかりません)。とにかく、ログイン名が表示されない場合は、問題のあるデータベースでスクリプトを実行してください。

sp_changedbowner 'sa'

これにより、dbo がデータベースの所有者 (またはそのようなもの) になります。私がこれを見つけた理由は、この GUI インターフェイスを介して「db_datareader」、「db_datawriter」などの権限の一部を保存しようとしたが、ログイン名が必要であるというエラーがスローされたためです。dbo には db_owner をチェックする必要があると思います (私の場合はチェックします)。

2)procを機能させるために、procの最後に「 with execute as owner 」を追加する必要がありました。以前にこれを試しましたが、最初の問題#1のために機能しなかったと思います. 通常、proc は proc の所有者の下で実行されますが、proc 内の動的 SQL は実行されません。これらは、proc を実行しているユーザーのコンテキストで実行されます。私はこれを動的SQL(私が試した)に追加する必要があると思うので、これは奇妙ですが、proc自体にある必要があります(図に行きますか?)

3) おそらく、このスクリプトも実行しても問題はありません。

「MyTable」の選択を「MyUser」に許可します

動的SQLで使用されるすべてのテーブルに対して。

お役に立てれば...

この同じ問題への参照は次のとおりです。

http://www.jimmcleod.net/blog/index.php/2007/05/15/sp_executesql-breaks-chain-of-ownership-in-sql-server-2000/

http://kbalertz.com/301299/Security-Context-Dynamic-Statements-Inside-Stored-Procedure.aspx

http://www.mssqltips.com/tipprint.asp?tip=1822

于 2010-02-04T20:42:18.487 に答える
0

私を助けたのは:

SQL Management Studio で、ストアド プロシージャを右クリックして [プロパティ] を選択し、[アクセス許可] ページで、関連するユーザーにアクセス許可を付与します。関連するユーザーは、SQL 接続文字列によって異なります。Windows 認証を使用している場合は、Windows ユーザーです (構成されている場合は ASPNET の可能性があります)。それ以外の場合は、接続文字列で指定した SQL ユーザーです。付与する必要がある権限は、実行権限です。

于 2011-10-28T20:54:45.663 に答える