现有SQL SERVER服务器A和B,两个环境都提前创建好用户,设置好权限,然后搭建的AlwaysOn,主副本为A,辅助副本为B,客户端连接正常。切换主库为B后,客户端无法连接。查看A与B中的用户权限可以发现,用户名密码都是一样的,但在数据库映射这一项,A中用户有映射到相应库,B中却没有。于是添加映射,保存,这时提示:用户已存在!(这是B为主库时才能做的操作,若A为主库,在B上执行此操作会提示B为只读。。。)
后来问了度娘,找到以下方法:
步骤1:查看主库上该账号的sid:
SELECT * FROM [dbName]..sysusers
或者:
select [sid] from sys.syslogins where name='xxx'
步骤2:在副本数据库上创建对应账号:
CREATE LOGIN [帐号] WITH PASSWORD = '?',
SID = ?, --从上面的查询从获取
DEFAULT_DATABASE = [数据库名称], --默认数据库
CHECK_EXPIRATION = OFF, --强制密码过期 关闭
CHECK_POLICY = OFF --强制密码策略 关闭
这样就可以解决以上问题。据个人理解,绑定到数据库权限的应该是用户SID,B中直接创建的用户,虽然名称与密码一致,但SID不同,也是无法继承到权限。所以:
如果数据库想搬迁到其他环境,或AlwaysOn的从库中运行,都需要用相同的SID来创建用户。
或者,只是搬迁数据库,可以解除孤立用户,重新设置权限:
USE 数据库名
GO
sp_change_users_login 'update_one','用户名','用户名'
评论
