注:この質問は同じシナリオを提示する一連の質問の一部です。連載の各質問には、記載されている目標を達成できる可能性のある固有の解決策が含まれています。他の人が正しい解決策を持っていないかもしれない間、いくつかの質問セットは複数の正しい解決策を持つかもしれません。
このセクションで質問に答えた後は、それに戻ることはできません。その結果、これらの質問はレビュー画面に表示されません。
あなたの会社は、Microsoft Azure SQL Databaseインスタンスのデータにアクセスする新しいビジネスインテリジェンスアプリケーションを開発しています。インスタンス内のすべてのオブジェクトは同じ所有者を持ちます。
BI_Userという名前の新しいセキュリティプリンシパルには、データベースでストアドプロシージャを実行するためのアクセス許可が必要です。
ストアドプロシージャは、データベース内のテーブルとの間で読み書きを行います。どのストアード・プロシージャーもIDENTIFY_INSERT操作または動的SQLコマンドを実行しません。
パーミッションの範囲とBI_Userの認証はデータベースに限定されるべきです。許可を与えるときは、最小特権の原則を使用する必要があります。
必要なセキュリティプリンシパルを作成して適切な権限を付与する必要があります。
解決策:masterデータベースで次のTransact-SQLステートメントを実行します。
PASSWORD = 'Pa $$ wrd'でログインBI_Userを作成します。
ビジネスインテリジェンスデータベースで次のTransact-SQLステートメントを実行します。

解決策は目標を満たしていますか?
正解:B
説明/参照:
Explanation:
データにアクセスできるようにするデータベースロールに対して、ストアドプロシージャに対するEXECUTE権限を付与すれば十分です。このユーザーにロールを追加する必要はありません。
注意:
データベースの周囲に複数の防御線を作成する1つの方法は、ストアドプロシージャまたはユーザー定義関数を使用してすべてのデータアクセスを実装することです。テーブルなどの基になるオブジェクトに対するすべての権限を取り消すか拒否し、ストアドプロシージャに対するEXECUTE権限を付与します。これにより、データおよびデータベースオブジェクトの周囲にセキュリティ境界が効果的に作成されます。
ベストプラクティス
単純にストアドプロシージャを作成するだけでは、アプリケーションを十分に保護できません。また、次のような潜在的なセキュリティホールも考慮する必要があります。
可能にしたいデータベースロールのストアドプロシージャに対するEXECUTEパーミッションを付与します。

データにアクセスします。
データベース内のすべてのロールとユーザーについて、基礎となるテーブルに対するすべての権限を取り消すか拒否します。

公共の役割を含む。すべてのユーザーはパブリックから権限を継承します。したがって、パブリックへのアクセス許可を拒否することは、所有者とsysadminメンバーだけがアクセス権を持つことを意味します。他のすべてのユーザーは、他の役割のメンバーシップから権限を継承することはできません。
sysadminまたはdb_ownerロールにユーザーまたはロールを追加しないでください。システム管理者とデータベース

所有者はすべてのデータベースオブジェクトにアクセスできます。
参照:https://docs.microsoft.com/ja-jp/dotnet/framework/data/adonet/sql/managing-permissions- with-stored-Procedures-in-sql-server