Always on 孤立用户问题

问题:sql

==============数据库

一些数据库配置了Always ON高可用性组。还有的能够访问到主体数据库登陆一次,但转移后,就没法登陆到备用服务器上的新主体数据库。windows

 

缘由:安全

==============服务器

该问题是由于每台服务器上的SQL Server登陆的SID(安全标识符)不匹配。尽管对于登陆的名字是相同的,但登陆经由该login的SID解决。这不是Windows /域用户/组登陆的问题,由于这些登陆的SID是基于域SID为用户/组建立,所以将成为给定同一用户/组相同的,不管添加到什么样的SQL Server用户/组。ide

 

解决方案:spa

==============server

咱们须要在secondary replica上面建立SQL Server login,不单单具备相同的名称,并且还具备相同SID在主服务器上建立SQL Server登陆。下面相关的语句:ip

------------------------------------------ci

SELECT

  'createlogin [' +p.name + '] ' +

  casewhenp.type in('U','G') then 'from windows ' else '' end +

 'with ' +

 case when p.type = 'S' then 'password = ' + master.sys.fn_varbintohexstr(l.password_hash) + ' hashed, ' +

 'sid = ' + master.sys.fn_varbintohexstr(l.sid) +

  ',check_expiration = ' + case when l.is_expiration_checked >0 then 'ON, ' else 'OFF, ' end +

  'check_policy= ' + case when l.is_policy_checked> 0 then 'ON, ' else 'OFF, ' end +

 case when l.credential_id > 0 then 'credential = ' + c.name + ', ' else '' end

  else '' end +

 'default_database = ' + p.default_database_name+

 case when len(p.default_language_name) >0 then ',default_language = ' + p.default_language_name else '' end

FROM sys.server_principals p

LEFT JOIN sys.sql_logins l ON p.principal_id = l.principal_id

LEFT JOIN sys.credentials c ON  l.credential_id= c.credential_id

WHERE p.type in('S','U','G')

AND p.name<> 'sa'

------------------------------------------

在主服务器上面运行,并将结果在副本中执行。

相关文章
相关标签/搜索