10

すべてのアクセスがストアド プロシージャによって制御されるデータベースがあります。DBA は、基礎となるテーブルへの直接の読み取り/書き込みアクセス権をユーザーに付与することを避けたいと考えていますが、これは理解できます。したがって、データのすべての更新と選択は、ストアド プロシージャを介して行われます。基本的に、彼はデータベース内のすべてのストアド プロシージャに対する EXECUTE 権限を持つ 1 つのロールを作成し、ユーザーにそのロールを与えました。

問題は、ストアド プロシージャの 1 つが動的に SQl クエリを作成し、それを "Execute sp_Executesql" を介して実行することです。多くのユーザー入力パラメーターに応じて大幅に変化するため、クエリは動的に構築されます。問題のストアド プロシージャは SELECT sql ステートメントにすぎませんが、ストアド プロシージャに EXECUTE 権限を与えるだけでは不十分であることがわかりました。"Execute sp_Executesql" を使用するストアド プロシージャ内で参照される基になるテーブルには、"datareader" アクセス権が付与されている必要があります。付与されていない場合、ストアド プロシージャは失敗します。

これを修正する方法について何か考えはありますか?テーブルへのアクセスをストアド プロシージャのみに制限したかったのですが、"Execute sp_Executesq"l を使用するストアド プロシージャを回避する方法を見つける必要があります。ありがとうございました。

4

2 に答える 2

16

ラッパープロシージャでは、EXECUTE AS OWNERまたはを使用できますEXECUTE AS SomeuserWithNoLogin

これにより、sp_executesql を含むストアド プロシージャの期間中のログイン コンテキストが変更されます。

  • OWNER を使用する場合は、既に所有権の連鎖を使用しているため機能します。
  • DBA (いい人です!) が dbo として実行することを望まない場合は、完全な読み取り権限はあるが権限のないユーザーを設定します。EXECUTE AS <user>エントリが必要ですsys.database_principals

このような:

CREATE USER SomeuserWithNoLogin WITH WITHOUT LOGIN
EXEC sp_addrolemember 'db_datareader', 'SomeuserWithNoLogin'

詳細については、MSDN の EXECUTE AS 句CREATE PROCEDURE

于 2010-09-28T19:59:06.180 に答える
-3

本当の問題は、sp_Executesql が master データベースにあり、必ずしも作業中のデータベースではないことです。DBA は、呼び出し元のプロシージャに sp_Executesql の実行権限を付与する必要があります。そのプロシージャを呼び出す権限を持つユーザーは誰でも sp_Executesql を実行できます。

于 2010-09-28T19:58:02.890 に答える