Sam*_*ham 7 sql-server sql-server-2012 availability-groups logins
我有一个可用性组,需要将一些登录名映射到活动辅助副本上的数据库用户。(Node2) 不幸的是,当我尝试exec sp_change_users_login或 时alter user with login,我收到一条错误消息,告诉我数据库是只读的。这并不奇怪,但我不知道如何解决它。我昨晚尝试故障转移,修复 Node2 上的登录,然后故障返回到 Node1,但随后登录/用户映射最终在 Node1 上出错。当我修复这些问题时,Node2 的登录再次失灵。
这是一个生产系统,所以直到今晚晚些时候我才能做任何我想做的事情。我在我们的测试实验室中没有遇到这个问题。不同之处可能是我之前在加入数据库之前创建了登录名,而这次我尝试在之后创建它们,但未能正确记录该过程。如果可以,我宁愿避免将 AG 拆除并重建它。
这个问题对我来说很有意义,我只是不知道如何解决它。
您需要做的是连接到 SID 不匹配的实例,您必须重新创建登录名并指定显式 SID。例如,在您拥有孤立用户的实例上,以下返回用户:
exec sp_change_users_login 'report';
go
Run Code Online (Sandbox Code Playgroud)
从列中复制 SID UserSID。如果您已经有一个想要保留该实例上的名称的现有登录名,则不能。没有办法ALTER LOGIN更改 SID。因此,您需要删除登录名并重新创建它:
drop login YourLogin;
go
create login YourLogin
with
password = 'password',
check_policy = off, -- simple password and no check policy for example only
sid = 0xC26909...................;
go
Run Code Online (Sandbox Code Playgroud)
同样,你将要设置的sid参数CREATE LOGIN为UserSID你执行检索sp_change_users_login用report。
注意:您需要将此/这些副本的密码设置为相同,这样副本之间就不会出现密码不匹配的情况。
我假设这里有问题的登录名是 SQL Server 登录名,因为这对于 Windows Auth 域帐户来说应该不是问题,因为每个实例上的 SID 应该相同。
您还可以在此处利用包含的数据库,并在数据库级别对数据库主体进行身份验证。这样您就不必担心孤立用户。
以下是有关此方面的一些文档:有关如何在 SQL Server 实例之间传输登录名和密码
的可用性组数据库KB 文章管理登录名和作业的 BOL 参考
此外,这应该是不言而喻的,但在开发/QA 环境中进行测试,以在投入生产之前验证并确保正确的功能。