數據庫用戶通過 SID(安全標識符) 與服務器登錄關聯。還原/遷移數據庫時,用戶表中的 SID 保持原樣,但新實例建立的同名登錄 SID 不同,導致映射斷裂:用戶存在但無法登錄、無權限訪問原屬對象。
| 模式 | 用途 | 語法 | 適用場景 |
|---|---|---|---|
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'; | 無登錄、需一鍵修復 |
USE TargetDB;EXEC sp_change_users_login 'Report';EXEC sp_change_users_login 'Update_One', 'test', 'test';EXEC sp_change_users_login 'Auto_Fix', 'test', NULL, 'StrongPwd#2024';
-- 查看用戶 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
-- 直接修改用戶 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。