首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL Server 錯誤 15023 解決方案:孤立用戶修復與 sp_change_users_login 實戰

     編輯:MySQL 資料庫相關知識

將遠程備份還原至本地後,嘗試將「登錄」映射到「用戶」時提示 錯誤 15023:用戶或角色已存在。根因是 SID 不匹配導致「孤立用戶」。本文詳細講解登錄與用戶關係、孤立用戶成因、sp_change_users_login 修復步驟與現代 ALTER USER ... WITH LOGIN 替代方案。

一、核心概念:登錄 vs 用戶

還原備份時,數據庫帶入用戶及其 SID,但新服務器的登錄 SID 可能不同 → SID 不匹配 → 孤立用戶。

二、錯誤 15023 觸發場景

在 SSMS「用戶映射」頁勾選數據庫、選擇角色 → 確定時,系統嘗試創建同名用戶,發現同名用戶已存在但 SID 不同 → 報錯:

錯誤 15023 對話框

三、修復方案 1:sp_change_users_login (SQL Server 2000-2014)

USE Northwind;  -- 目標數據庫
GO
EXEC sp_change_users_login 'Update_One', 'test_user', 'test_login';
  • Update_One:單用戶修復模式。
  • 'test_user':數據庫內孤立用戶名。
  • 'test_login':服務器級登錄名(需預先存在)。
  • 效果:將用戶 test_user 的 SID 更新為登錄 test_login 的 SID,關聯恢復正常。

批量修復:EXEC sp_change_users_login 'Auto_Fix', 'user_name', NULL, 'password'; 自動創建登錄並關聯(需密碼)。

四、修復方案 2:ALTER USER ... WITH LOGIN (SQL Server 2012+ 推薦)

USE Northwind;
ALTER USER test_user WITH LOGIN = test_login;
  • 語法更標準、可讀性強、無需記住存儲過程參數。
  • 支援 WITH LOGIN = [login_name] 顯式指定。

五、預防最佳實踐

  1. 含登錄備份:BACKUP LOGINS(需腳本導出 CREATE LOGIN ... WITH SID = ...)或使用 dbatools PowerShell 模組 Copy-DbaLogin 同步登錄。
  2. AlwaysOn / 鏡像環境:自動同步登錄 SID,無孤立用戶問題。
  3. 還原後立即檢查:EXEC sp_change_users_login 'Report'; 列出所有孤立用戶,批量修復。

六、總結

錯誤 15023 本質是 SID 不匹配導致的孤立用戶。舊版用 sp_change_users_login,新版首選 ALTER USER ... WITH LOGIN。建立「登錄隨備份同步」機制,從源頭杜絕遷移、還原、高可用切換時的用戶映射故障。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
對象層級用途標識
登錄服務器級身份驗證(密碼、Windows 驗證)SID (Security Identifier)
用戶數據庫級授權、權限控制名稱 + SID 關聯登錄