當您將數據庫備份恢復到另一台服務器時,可能會遇到孤立用戶的問題。SQL Server 聯機叢書中的孤立用戶疑難解答主題中沒有講述解決此問題的具體步驟。
本文介紹了如何解決孤立用戶問題。
狀態
Microsoft 已經確認這是在本文開頭列出的 Microsoft 產品中存在的問題。
更多信息
雖然術語“登錄”和“用戶”經常交換使用,但它們之間有很大的不同。登錄用於用戶身份驗證,而數據庫用戶帳戶用於數據庫訪問和權限驗證。登錄通過安全識別符 (SID) 與用戶關聯。訪問 SQL Server 服務器需要登錄。驗證特定登錄是否有效的過程稱為“身份驗證”。登錄必須與 SQL Server 數據庫用戶相關聯。您使用用戶帳戶控制數據庫中執行的活動。如果數據庫中不存在針對特定登錄的用戶帳戶,使用該登錄的用戶即使能夠連接到 SQL Server 服務器,也無法訪問數據庫。但是,該情形的唯一例外是當數據庫包含“guest”用戶帳戶時。與用戶帳戶不關聯的登錄將被映射到 guest 用戶。相反,如果存在數據庫用戶,但沒有與其關聯的登錄,則該用戶將無法登錄到 SQL Server 服務器中。
將數據庫恢復到其他服務器時,數據庫中包含一組用戶和權限,但可能沒有相應的登錄或者登錄所關聯的用戶可能不是相同的用戶。這種情況被稱為存在“孤立用戶”。
孤立用戶疑難解答
當您將數據庫備份恢復到另一台服務器時,可能會遇到孤立用戶的問題。以下情形說明了該問題並闡述如何加以解決。 1. 向主數據庫添加一個登錄,並將默認數據庫指定為 Northwind: Use master go sp_addlogin 'test', 'password', 'Northwind'
2. 向剛創建的用戶授予訪問權限: Use Northwind go sp_grantdbaccess 'test'
3. 備份數據庫。
BACKUP DATABASE Northwind
TO DISK = 'C:\MSSQL\BACKUP\Northwind.bak'
4. 將數據庫恢復到其他 SQL Server 服務器:
RESTORE DATABASE Northwind
FROM DISK = 'C:\MSSQL\BACKUP\Northwind.bak'
恢復的數據庫包含名為“test”的用戶,但沒有相應的登錄,這就導致“test”成為孤立用戶。
5. 現在,為了檢測孤立用戶,請運行此代碼: Use Northwind go sp_change_users_login 'report'
輸出中列出了所有登錄,其中包含 Northwind 數據庫的 sysusers 系統表和主數據庫的 sysxlogins 系統表中不匹配的條目。
解決孤立用戶問題的步驟
1. 為前一步中的孤立用戶運行以下命令:
Use Northwind
go
sp_change_users_login 'update_one', 'test', 'test'
這樣,就將服務器登錄“test”與 Northwind 數據庫用戶“test”重新連接起來。sp_change_users_login 存儲過程還可以使用“auto_fix”參數對所有孤立用戶執行更新,但不推薦這樣做,因為 SQL Server 會嘗試按名稱匹配登錄和用戶。大多數情況下這都是可行的;但是,如果用戶與錯誤登錄關聯,該用戶可能擁有錯誤的權限。
2. 在上一步中運行代碼後,用戶就可以訪問數據庫了。然後用戶可以使用 sp_password 存儲過程更改密碼:
Use master
go
sp_password NULL, 'ok', 'test'
此存儲過程不能用於 Microsoft Windows NT 安全帳戶。通過 Windows NT 網絡帳戶連接到 SQL Server 服務器的用戶是由 Windows NT 授權的;因此,這些用戶只能在 Windows NT 中更改密碼。
只有 sysadmin 角色的成員可以更改其他用戶的登錄密碼。
參考
有關在服務器之間移動數據庫時如何解決權限問題的其他信息,請單擊下面的文章編號,查看 Microsoft 知識庫中相應的文章:
240872 INF:在 SQL 服務器之間移動數據庫時如何解決權限問題