天天看點

Always on 孤立使用者問題

問題:

==============

一些資料庫配置了Always ON高可用性組。還有的可以通路到主體資料庫登入一次,但轉移後,就無法登入到備用伺服器上的新主體資料庫。

原因:

該問題是因為每台伺服器上的SQL Server登入的SID(安全辨別符)不比對。盡管對于登入的名字是相同的,但登入經由該login的SID解決。這不是Windows /域使用者/組登入的問題,因為這些登入的SID是基于域SID為使用者/組建立,是以将成為給定同一使用者/組相同的,無論添加到什麼樣的SQL Server使用者/組。

解決方案:

我們需要在secondary replica上面建立SQL Server login,不僅僅具有相同的名稱,而且還具有相同SID在主伺服器上建立SQL Server登入。下面相關的語句:

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

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'

上一篇: adb指令
下一篇: 2018年終總結