Sql-Server

如何連結可用性組中的使用者和登錄名?

  • January 30, 2014

我有一個可用性組,需要將一些登錄映射到活動輔助副本上的數據庫使用者。(Node2) 不幸的是,當我嘗試exec sp_change_users_loginor時alter user with login,我收到一條錯誤消息,告訴我數據庫是只讀的。這並不奇怪,但我不知道如何解決它。我昨晚嘗試故障轉移,修復 Node2 上的登錄,然後故障返回到 Node1,但是登錄/使用者映射最終在 Node1 上出錯。當我修復這些問題時,Node2 的登錄再次失控。

這是一個生產系統,所以直到今晚晚些時候我才能做任何我想做的事情。我在我們的測試實驗室沒有遇到這個問題。不同之處可能是我之前在加入數據庫之前創建了登錄名,而這次我嘗試在之後創建它們,但未能正確記錄該過程。如果可以的話,我寧願避免拆掉 AG 並重建它。

這個問題對我來說很有意義,我只是不知道如何解決它。

您需要做的是連接到 SID 不匹配的實例,並且您必須重新創建登錄名並指定顯式 SID。例如,在您擁有孤立使用者的實例上,以下內容返回該使用者:

exec sp_change_users_login 'report';
go

從列中複製 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

同樣,您需要將sid參數設置CREATE LOGINUserSID您從sp_change_users_login使用report.

注意:您需要將此/這些副本上的密碼設置為相同,以免副本之間的密碼不匹配。

我假設您這裡有問題的登錄名是 SQL Server 登錄名,因為這對於 Windows Auth 域帳戶應該不是問題,因為每個實例上的 SID 應該是相同的。

您還可以在此處利用包含的數據庫,並讓數據庫主體在數據庫級別進行身份驗證。這樣您就不必擔心孤立的使用者。

以下是一些關於此的文件:

關於可用性組數據庫的登錄和作業管理的 BOL 參考關於

如何在 SQL Server 實例之間傳輸登錄名和密碼的知識庫文章

此外,這不言而喻,但在開發/QA 環境中進行測試,以在投入生產之前驗證並確保正確的功能。

引用自:https://dba.stackexchange.com/questions/30036