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

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

データにアクセスします。
データベース内のすべてのロールとユーザーの基になるテーブルへのすべてのアクセス許可を破棄または拒否し、

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

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