我的本地 MS SQL Server 2012 实例上有多个(约 15 个)数据库。我正在运行 FluentMigrator 以在(可能)所有这些数据库上执行迁移脚本。目前我正在使用 Windows 身份验证通过我自己的 Windows 域帐户连接到 SQL Server。对应的 SQL Server 登录是“sysadmin”服务器角色的成员,因此它具有对所有数据库的隐式访问权限,我不需要在每个数据库中创建用户并将其映射到此登录。
显然,这种设置在生产场景中不会被接受。在生产环境中运行 FluentMigrator 的人都将限制 SQL Server 登录权限,而且肯定不会是“系统管理员”。我试图以尽可能干净和最小的方式定义专用迁移器 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 登录映射到每个数据库中的一个数据库用户,并向这些用户授予适当的数据库权限。但是,我真的很想避免下降到数据库级别并使用这些专用用户污染数据库。
所以我的问题是:是否可以在服务器级别设置所有必需的权限?如果是,那么必须向上述服务器角色授予哪些其他权限,以便该角色的成员能够查看和更改该服务器实例中的所有数据库?