[SQL]AlwaysON 帳號設定

[SQL]AlwaysON SQL 登入帳號設定

在寫前一篇 AlwaysON 的容錯移轉之後,雖然可以正常的在兩個 Node 之間順利進行移轉,但是當我建立一個 SQL 登入帳號要配合所開發的系統去測試的時候,卻又引發另外的問題了。為了解決這個問題,透過一些網路上高手的說明,讓我更了解 SQL Server 帳號管理的一些細節,為了避免以後癡呆忘記,因此把相關細節做個整理,也順便謝謝那些高手所提供的寶貴資訊。

 

1. 首先我先用 SQL 指令建立一個登入帳號,可以用來登入所測試的 TEST 資料庫

   1: USE [master]
   2: GO
   3: CREATE LOGIN [User1] WITH PASSWORD=N'123', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
   4: GO
   5: USE [TEST]
   6: GO
   7: CREATE USER [User1] FOR LOGIN [User1]
   8: ALTER ROLE [db_owner] ADD MEMBER [User1]
   9: GO

2. 寫個一個測試的 VB Script , 用來連接 AlwaysON 的 Listen , 這裡都還沒有問題

   1: Dim Cnxn
   2: Dim Rs
   3:  
   4: Set Cnxn = CreateObject("ADODB.Connection")
   5: Set Rs   = CreateObject("ADODB.Recordset")
   6: Cnxn.ConnectionString = "Provider=SQLOLEDB.1;Password=123;Persist Security Info=True;User ID=User1;Initial Catalog=TEST;Data Source=10.40.40.213"
   7:  
   8: Cnxn.Open 
   9: Rs.Open "select * from dbo.T01", Cnxn , 1 , 1
  10:  
  11: Msgbox Rs.RecordCount
  12:  
  13: Rs.Close
  14: Cnxn.Close
3. 但此時要是我將原本的主要伺服器 AlwaysON_1 移轉成為 AlwaysON_2 之後,原本前面第二個步驟所使用的 Script 在執行一次的話

AlwaysON01

AlwaysON02

 

4. 此時如果我到 AlwaysON_2 的環境上,想要透過原本在第 1 個步驟上面去建立照號的話,則會出現以下的錯誤訊息

訊息 15023,層級 16,狀態 1,行 1
使用者、群組或角色 'User1' 在目前的資料庫中已經存在。

 

5. 要解決這樣的帳號的問題,基本上會有三個方式:

  • 使用 SQL Server 2012 的 Contained Databases 的方式
  • 使用 Windows 驗證登入帳戶
  • 建立具有相同 SID 和密碼的 SQL 驗證登入帳戶

   因為目前我主要是配合所開發的系統使用 AlwaysON 的技術,而且會有跨資料庫存取的需求,因此就無法使用 Contained Databases 或者是 Windows 驗證的方式,透過一些網路上的高手的指點,微軟有一篇 kb 918992 的文件,就有類似的處理方式。

 

6. 如果覺得 KB 918992 上的 Script 過於複雜,我個人有個比較簡單的方法,或許可以更方便了解,如果不熟悉 SUSER_ID 和 LOGINPROPERTY 的用法,可以另外參考 MSDN 上面的介紹 ( SUSER_ID , LOGINPROPERTY )

   1: select 
   2:   SUSER_SID(  'User1' ) as SID,
   3:   LOGINPROPERTY('User1', 'PasswordHash' ) as Password

AlwaysON03

 

7. 接下來利用 Copy/Paste 將 Query 所取得的 SID 和 Password 的值複製出來,組成以下的 SQL 指令,將這個指令複製到 AlwaysON_2 的環境下執行

   1: CREATE LOGIN [User1] WITH 
   2:   PASSWORD = 0x0200D0FF44D2246537593CC9164F133CCAB1076CAD00AF7BB3DFB2153692FE34BCAB27D0A12EC287579B180E1DC8FC5D63D5B71D3E0884CD478CB2749E4C0B64970792F9905C HASHED, 
   3:   SID = 0x37615452F0A999438C1B6AA0ED744A72, 
   4:   DEFAULT_DATABASE = [master], CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF

 

透過上述的方式,就可以將帳號在 AlwaysON 的環境上同步。如果對於 SQL Server 帳號管理有興趣的朋友,個人建議可以參考 SQL Server 2012 管理實戰 上面的第七章安全性管理,裡面有很詳細的說明。