企業管理器 → 新增登入 → 「資料庫存取」分頁勾選目標資料庫時,彈出:
錯誤 21002:[SQL-DMO] 使用者 'UserName' 已經存在。
sysusers/sys.database_principals 保留了原使用者記錄(含 SID)。sys.server_principals 無對應登入(SID 不匹配)。CREATE LOGIN [UserName] WITH PASSWORD = 'StrongPassword@123';
-- 或 Windows 驗證
CREATE LOGIN [DOMAIN\UserName] FROM WINDOWS;
USE TargetDatabase;
GO
EXEC sp_change_users_login 'Update_One', 'UserName', 'UserName';
GO
Update_One:將資料庫使用者 UserName 的 SID 更新為登入 UserName 的 SID。
USE TargetDatabase;
GO
DECLARE @user SYSNAME;
DECLARE cur CURSOR LOCAL FAST_FORWARD FOR
SELECT name FROM sys.database_principals
WHERE type IN ('S','U','G') AND sid IS NOT NULL
AND sid NOT IN (SELECT sid FROM sys.server_principals)
AND name NOT IN ('dbo','guest','INFORMATION_SCHEMA','sys');
OPEN cur;
FETCH NEXT FROM cur INTO @user;
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRY
EXEC sp_change_users_login 'Auto_Fix', @user;
PRINT 'Fixed: ' + @user;
END TRY
BEGIN CATCH
PRINT 'Failed: ' + @user + ' - ' + ERROR_MESSAGE();
END CATCH
FETCH NEXT FROM cur INTO @user;
END
CLOSE cur; DEALLOCATE cur;
-- 再次掃描孤立使用者
EXEC sp_change_users_login 'Report';
-- 應無記錄返回
sp_help_revlogin (Microsoft 提供) 產生含 SID 的 CREATE LOGIN 腳本,在目標伺服器先執行。sp_change_users_login 'Report' 並自動化修復。dbo 孤立需用 sp_changedbowner 修復(參考錯誤 21776 文章)。