ローカルの MS SQL Server 2012 インスタンスに複数 (~15) のデータベースがあります。FluentMigrator を実行して、(潜在的に) これらすべてのデータベースで移行スクリプトを実行しています。現在、Windows 認証を使用して、自分の Windows ドメイン アカウントで SQL Server に接続しています。対応する SQL Server ログインは「sysadmin」サーバー ロールのメンバーであるため、すべてのデータベースに暗黙的にアクセスでき、各データベースにユーザーを作成してこのログインにマップする必要はありません。
明らかに、この設定は本番シナリオでは受け入れられません。運用環境で FluentMigrator を実行する人は誰でも、SQL Server のログイン権限が制限され、「sysadmin」になることはありません。専用のマイグレーター SQL Server ログイン (MigrationAdmin) のアクセス許可をできるだけクリーンで最小限の方法で定義しようとしていたので、最初に考えたのは、ユーザー定義のサーバー ロールを作成し、ALTER ANY DATABASE
アクセス許可を付与することでした (移行スクリプトを実行する)、MigrationAdmin をこのロールのメンバーにします。
CREATE SERVER ROLE udsr_migrator
GO
GRANT ALTER ANY DATABASE TO udsr_migrator
GO
ALTER SERVER ROLE udsr_migrator ADD MEMBER [MigrationAdmin]
GO
ただし、MigrationAdmin アカウントで FluentMigrator を実行すると、次の例外がスローされます。
!!! System.Data.SqlClient.SqlException (0x80131904): Cannot open database "databasemigration" requested by the login. The login failed.
Login failed for user 'MigrationAdmin'.
at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
at System.Data.SqlClient.SqlConnection.Open()
許可にもかかわらずALTER ANY DATABASE
、このログインはまだこの特定のデータベースにアクセスできないようです。
これで、MigrationAdmin ログインを各データベースのデータベース ユーザーにマップし、これらのユーザーに適切なデータベース権限を付与できました。ただし、データベース レベルに降りて、これらの専用ユーザーでデータベースを汚染することは避けたいと思います。
私の質問は、サーバー レベルで必要なすべてのアクセス許可を設定することは可能でしょうか? はいの場合、上記のサーバー ロールには、このロールのメンバーがこのサーバー インスタンス内のすべてのデータベースを表示および変更できるようにするために、他にどのようなアクセス許可を付与する必要がありますか?