説明/参照:
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