SQL Server 2008 Expressエディションを使用しています。
ログイン、ユーザー、ロール、スキーマを作成しました。ユーザーをログインにマップし、ロールをユーザーに割り当てました。
スキーマには、いくつかのテーブルとストアドプロシージャが含まれています。
ロールにスキーマ全体の実行権限を持たせたいのですが。
Management Studioを介して、およびクエリウィンドウにコマンドを入力して、実行権限を付与しようとしました。
GRANT EXEC ON SCHEMA::schema_name TO role_name
しかし、SQL Management Studioを使用して(作成したログインとして)データベースに接続すると、最初にストアドプロシージャが表示されませんが、さらに重要なことに、それらを実行しようとすると、アクセス許可拒否エラーが発生します。
問題のストアドプロシージャは、同じスキーマ内のテーブルからデータを選択する以外は何もしません。
次の行を含む、または含まないストアドプロシージャを作成してみました。
WITH EXECUTE AS OWNER
これは何の違いもありません。
スキーマの作成時にエラーが発生したか、どこかに所有権の問題があると思われますが、何かを機能させるのに本当に苦労しています。
ストアドプロシージャの実行に成功した唯一の方法は、ロールに制御アクセス許可を付与することと実行することですが、これが正しい安全な方法であるとは思いません。
どんな提案/コメントも本当にいただければ幸いです。
ありがとう。
以下のテクニックで幸運を祈りました(例として"myschema"という名前のスキーマを使用)。ほとんどの部分が配置されているように見えますが、スキーマ/ロールの所有権が正しく設定されていない可能性があります。
-- Create the role that will own the schema
CREATE ROLE [myschema_owner] AUTHORIZATION [dbo];
-- Create the role that will have execute permissions on the schema
CREATE ROLE [myschema_execute] AUTHORIZATION [dbo];
-- Create the schema owned by our role
CREATE SCHEMA [myschema] AUTHORIZATION [myschema_owner];
-- Assign execute permissions to execute role
GRANT SELECT, EXECUTE ON SCHEMA::[myschema] TO [myschema_execute];
これを特定のスキーマに制限する方法はわかりませんが(構文は機能するように見えますが)、データベース全体に対する実行権限が許容される場合は、次の方法でうまくいきます。次に、次のような役割にログインを追加します。 Ankurは説明します。
grant execute to <ROLE_NAME>
また、このロールにVIEW DEFINITIONを付与すると、ロール内のログインが許可され、ストアドプロシージャが表示されます。