首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 孤立用戶修復實戰:sp_change_users_login 原理、Report/Update_One/Auto_Fix 三模式詳解

     編輯:關於SqlServer

什麼是孤立用戶?

數據庫用戶通過 SID(安全標識符) 與服務器登錄關聯。還原/遷移數據庫時,用戶表中的 SID 保持原樣,但新實例建立的同名登錄 SID 不同,導致映射斷裂:用戶存在但無法登錄、無權限訪問原屬對象。

sp_change_users_login 三大模式

模式用途語法適用場景
Report列出當前庫所有孤立用戶EXEC sp_change_users_login 'Report';遷移後首檢、審計
Update_One將指定孤立用戶映射到已存在的同名登錄EXEC sp_change_users_login 'Update_One', 'db_user', 'login_user';已手動建立登錄,需關聯
Auto_Fix自動創建登錄並映射(或映射現有)EXEC sp_change_users_login 'Auto_Fix', 'user', NULL, 'NewPwd#123';無登錄、需一鍵修復

實戰流程

  1. 切換到目標庫:USE TargetDB;
  2. 檢查孤立用戶:EXEC sp_change_users_login 'Report';
  3. 若已有同名登錄:EXEC sp_change_users_login 'Update_One', 'test', 'test';
  4. 若無登錄:EXEC sp_change_users_login 'Auto_Fix', 'test', NULL, 'StrongPwd#2024';
  5. 驗證:用修復後的登錄連接,查詢原屬表確認權限恢復。

底層原理


-- 查看用戶 SID
SELECT name, sid FROM sys.database_principals WHERE type = 'S';
-- 查看登錄 SID
SELECT name, sid FROM sys.server_principals WHERE type = 'S';
-- 修復本質:更新 sys.database_principals.sid = sys.server_principals.sid

現代替代方案(SQL Server 2012+)


-- 直接修改用戶 SID 映射到現有登錄
ALTER USER db_user WITH LOGIN = login_user;

-- 創建含 SID 的登錄(跨實例保持 SID 一致,根治孤立用戶)
CREATE LOGIN migration_user WITH PASSWORD = 'Pwd#123', SID = 0x...;  -- 從源實例導出 SID

避坑提示

  • Auto_Fix 會創建 SQL 登錄,若實例啟用「強制密碼策略」,密碼必須符合複雜度要求。
  • 多個數據庫有同名孤立用戶,需在每個庫執行 Update_One。
  • 含有 db_owner 等固定角色成員的孤立用戶,修復後角色保留,無需重授。
  • AlwaysOn 可用性組環境,主庫修復後會自動同步到從庫(含用戶 SID)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved