web-dev-qa-db-ja.com

ストアドプロシージャの実行を許可し、書き込みを許可しない方法は?

SQL Server 2012インスタンスに「読み取り」ユーザーを設定したいのですが。すべてのテーブルとビューからデータを取得するストアドプロシージャ、関数、または直接SQLステートメントを実行する権限を許可しますが、更新または挿入(つまり、何かを読み取り、何も書き込みません)は許可しません。

各関数またはストアドプロシージャに名前で特別な権限を与えずにこれをセットアップできますが、代わりに、関数またはストアドプロシージャに対する実行権を与え、テーブルを変更する権利を取り除きますか?

代わりにSQL Server 2008を実行すると何が変わりますか?

説明と追加:

  1. ストアドプロシージャがデータを変更した場合、ユーザーはエラーメッセージを受け取ります(変更を拒否するか、ストアドプロシージャへのアクセスを完全に拒否します)。
  2. 潜在的なソリューションにアクセス許可の拒否が含まれる場合、拒否する代わりに特定のアクセス許可を付与することはできませんか?
  3. データベース内のすべてのテーブル、ビューなど(現在および将来存在する)に1つのステートメントで拒否を適用できますか?
11
gt6989b

これは、思ったほど簡単には達成できません。 1つの方法は、新しいユーザー定義のデータベースロールを作成し、そのロールに必要なすべての権限を付与してから、ユーザーを新しいロールに追加することです。これにより、少なくともユーザー(または他のユーザー定義のロール)にこの一連の権限を簡単に付与できるようになります。次の手順は、良いスタートです:

-- The user-defined role containing all required permissions
CREATE ROLE Readers AUTHORIZATION dbo;

-- Give read-only access to all tables,
-- views on those tables, and in-line
-- functions
ALTER ROLE db_datareader ADD MEMBER Readers;

-- Example: add a user (Bob) to the role
ALTER ROLE Readers ADD MEMBER Bob;

この後、Bobはデータベースで幅広い読み取り専用権限を持ちます。彼はすべてのテーブル、それらのテーブルのビュー、およびインライン関数から読み取ることができます。ただし、プロシージャを実行したり、非インライン関数を使用したりすることはできません。

読者にアクセスを許可する安全な機能と手順のために、読者の役割に特定の権限を付与する必要があります。このプロセスを簡単にするために実行できる手順(オブジェクトをスキーマにグループ化し、個々のオブジェクトではなくスキーマに対する実行権限を付与するなど)があるかもしれませんが、ここで説明するには詳細が多すぎます。

変更するプロシージャとオブジェクトが共通の所有者を共有している場合、データ変更権限がなくても、Readerが実行権限を付与されているストアドプロシージャを介してReaderがデータを変更できなくなることはありません。この場合、明示的な拒否も尊重されません。この機能は Ownership Chaining として知られています。

15
Paul White 9