web-dev-qa-db-ja.com

サーバーの役割を使用してすべてのデータベースに権限を付与する

私はこの質問が何度も尋ねられたことを知っていますが、それらはすべて3歳以上なので、もう一度質問して運を試します。

MSSQLサーバー上のすべてのデータベースに読み取りアクセス許可を付与する必要があります。サーバーの役割を使用してこれを実現したいと思います。

次の権限を持つサーバーの役割を作成しました

CREATE SERVER ROLE ReadOnlyAccess 
GO
GRANT VIEW ANY DEFINITION TO ReadOnlyAccess
Go
GRANT VIEW ANY DATABASE TO ReadOnlyAccess
GO
GRANT VIEW SERVER STATE TO ReadOnlyAccess
GO
GRANT CONNECT SQL TO ReadOnlyAccess;
GO

このロールにユーザーを割り当てると、サーバーに接続できますが、データベースを拡張できません。私は「GRANT VIEW ANY DATABASE」がそれらの権利を与えるものだと思いましたが、少年は私が間違っていました...

ユーザーの各DBにdb_datareaderデータベースロールを付与せずにこれを実現する方法はありますか?新しいデータベースは常に作成されているため、これを手動で行うのはかなり悪夢です。数時間おきに実行するジョブを作成することでうまくいくと思いますが、それでもサーバーの役割を介して実行します。

何か案は? SQL 2016以降を使用しています。

2
Arturs Kirsis

私の回答を読む以外に、このQ&Aを Aaron Bertrand で見てください。

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

このソリューションは、SQL Server 2014以降で機能します。

CREATE LOGIN [AccountNeedPermission] FROM WINDOWS WITH DEFAULT_DATABASE=[master];
GO
GRANT CONNECT ANY DATABASE to [AccountNeedPermission];
GO
GRANT SELECT ALL USER SECURABLES to [AccountNeedPermission];
GO
GRANT VIEW ANY DEFINITION to [AccountNeedPermission];
GO

ソリューションが機能しない理由サーバーロールには、データベースレベルのセキュリティ保護可能なリソースに対する権限を付与できません。

2
SqlWorldWide