すべてのアクセスがストアド プロシージャによって制御されるデータベースがあります。DBA は、基礎となるテーブルへの直接の読み取り/書き込みアクセス権をユーザーに付与することを避けたいと考えていますが、これは理解できます。したがって、データのすべての更新と選択は、ストアド プロシージャを介して行われます。基本的に、彼はデータベース内のすべてのストアド プロシージャに対する EXECUTE 権限を持つ 1 つのロールを作成し、ユーザーにそのロールを与えました。
問題は、ストアド プロシージャの 1 つが動的に SQl クエリを作成し、それを "Execute sp_Executesql" を介して実行することです。多くのユーザー入力パラメーターに応じて大幅に変化するため、クエリは動的に構築されます。問題のストアド プロシージャは SELECT sql ステートメントにすぎませんが、ストアド プロシージャに EXECUTE 権限を与えるだけでは不十分であることがわかりました。"Execute sp_Executesql" を使用するストアド プロシージャ内で参照される基になるテーブルには、"datareader" アクセス権が付与されている必要があります。付与されていない場合、ストアド プロシージャは失敗します。
これを修正する方法について何か考えはありますか?テーブルへのアクセスをストアド プロシージャのみに制限したかったのですが、"Execute sp_Executesq"l を使用するストアド プロシージャを回避する方法を見つける必要があります。ありがとうございました。