1. 程式人生 > >Always on 孤立用戶問題

Always on 孤立用戶問題

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‘

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

在主服務器上面運行,並將結果在副本中執行。


本文出自 “傑克船長的博客” 博客,請務必保留此出處http://tianzj.blog.51cto.com/4107555/1980517

Always on 孤立用戶問題