問題: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'
------------------------------------------
在主服務器上面運行,並將結果在副本中執行。