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

SQL Server 孤立使用者修復:sp_change_users_login 與 CREATE LOGIN 實作步驟

     編輯:關於SqlServer

跨伺服器還原資料庫後,資料庫使用者失去對應伺服器登入,成為「孤立使用者」。症狀:SSMS 使用者屬性顯示「名稱」有值但「登入名」為空,無法登入、無法刪除。

快速檢測

USE RestoredDB;
EXEC sp_change_users_login 'Report';
-- 列出所有孤立使用者 (UserName 與 SID 不符)

修復步驟 (單一使用者)

  1. 在 master 建立對應登入 (若不存在):
    CREATE LOGIN [LoginName] WITH PASSWORD = 'Str0ngP@ss!';
  2. 在目標資料庫對應:
    USE RestoredDB; EXEC sp_change_users_login 'Update_One', 'UserName', 'LoginName';
  3. 驗證:EXEC sp_change_users_login 'Report'; 應無該使用者。

批次修復 (Auto_Fix)

USE RestoredDB;
DECLARE @User SYSNAME;
DECLARE cur CURSOR FOR
SELECT UserName FROM #OrphanedUsers;  -- 由 Report 產生暫存表
OPEN cur;
FETCH NEXT FROM cur INTO @User;
WHILE @@FETCH_STATUS = 0 BEGIN
    -- 嘗試自動對應同名登入,若無則建立隨機密碼登入
    EXEC sp_change_users_login 'Auto_Fix', @User, NULL, 'AutoGenPwd_'+@User;
    FETCH NEXT FROM cur INTO @User;
END
CLOSE cur; DEALLOCATE cur;

警告:Auto_Fix 依名稱匹配,若同名登入實為不同人會導致權限錯置,**生產環境建議逐一 Update_One**。

含有資料庫擁有者 (dbo) 的特殊情況

-- 還原後 dbo 可能對應舊 SID,導致無法授權
EXEC sp_changedbowner 'NewLoginName';  -- 重新指定資料庫擁有者

預防措施

  • **相同 SID 建立登入**:跨伺服器移轉時,在目標伺服器用 CREATE LOGIN ... WITH SID = 0x... 保持 SID 一致。
  • **資料庫層級包含的使用者 (Contained User, SQL 2012+)**:CREATE USER ... WITH PASSWORD = ... 無需伺服器登入,隨資料庫移動零修復。

結語

孤立使用者是跨伺服器還原的標準副作用。掌握 sp_change_users_login 'Report'/'Update_One' 標準修復流程,並預先規劃 SID 一致或採用 Contained User,可將移轉風險降至最低。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved