web-dev-qa-db-ja.com

SQL Server 2012で読み取り専用サーバーロールを作成する方法

新しいサーバーの役割を作成するときに「データベースの表示」権限を付与していますが、この権限はユーザーがシステムデータベースを表示することしか許可していないことに気付きました。

読み取り専用で、任意のデータベースを読み取ることができるサーバーの役割を作成しようとしています。

ユーザーデータベースを読み取るユーザー定義のサーバーロールを作成する方法はありますか?または、ユーザーごとのユーザーマッピングを通じてこれを行う必要がありますか?

15
joha

コメントとしては長すぎるため、そしてがすぐに他のユーザーに関連するため、これを回答として投稿します。

SQL Server 2014では、この種のシナリオに役立つ新しいサーバーレベルのアクセス許可がいくつか追加されています。これらは監査を念頭に置いて設計されていますが、この種の要件もその要件を満たすようです。サーバーレベルのログインに次の2つの権限を追加するだけです。

CONNECT ANY DATABASE

SELECT ALL USER SECURABLES

前者は、そのように聞こえますが、ログインはどのデータベースにも接続できます。これのいいところは、将来作成されるデータベースでもこれを許可することです(このアクセス許可を持つログインから特定のユーザーデータベースを保護する方法である明示的な拒否を設定しない場合)。後者を使用すると、ログインは、アクセスできる任意のデータベースで読み取り操作を実行できます。したがって、テーブル、ビュー、UDFなどからSELECTを実行できますが、UPDATE操作を実行することはできません。 (ストアドプロシージャがDMLを実行するときにこの権限が理解できるかどうかはテストしていません)。ログイン全体にサーバー全体への読み取りアクセスを許可する場合、または特定のデータベースに従来のCONNECT特権を付与する場合、およびSELECT ALL USER SECURABLES権限はonlyログインが明示的にアクセスできるデータベースに対して機能します。

2014年のセキュリティ変更はここに文書化されています -まあ、部分的に;彼らはデータベースレベルの権限ALTER ANY DATABASE EVENT SESSIONを忘れていましたが、ここでは関係ありません。

16
Aaron Bertrand

サーバーレベルの「データベースを読み取る」権限はありません およびサーバーレベルのロール データベースレベルの権限を付与することはできません

そのため、はい、ユーザーを個別にデータベースにマップする必要があります。 Active Directoryを使用している場合は、Windowsグループを作成し、そのグループにSQL Serverへのログインを許可してから、そのグループのすべてのデータベースにdb_datareaderを適用します(ただし、各データベースにユーザーを作成する必要があります)。

8
Simon Righarts