當資料庫還原至不同伺服器,或登入被刪除重建後,資料庫內的使用者 (sysusers) 與伺服器登入 (syslogins) 的 SID 不匹配,導致使用者無法登入該資料庫,即為「孤立使用者」。
CREATE PROCEDURE [dbo].[LoneUser]
@DBName NVARCHAR(50), -- 目標資料庫名稱
@UserName NVARCHAR(50) -- 需修復的使用者名稱
AS
BEGIN
SET NOCOUNT ON;
-- 允許直接更新系統表(SQL 2000 需求,新版請用 ALTER USER)
EXEC sp_configure 'allow updates', 1;
RECONFIGURE WITH OVERRIDE;
DECLARE @ExecStr NVARCHAR(4000);
SELECT @ExecStr = N'
DECLARE @b VARBINARY(85);
USE master;
SELECT @b = sid FROM syslogins WHERE name = ''' + @UserName + ''';
USE ' + @DBName + ';
UPDATE sysusers SET sid = @b WHERE name = ''' + @UserName + ''';';
-- PRINT @ExecStr; -- 除錯用
EXEC(@ExecStr);
-- 恢復設定
EXEC sp_configure 'allow updates', 0;
RECONFIGURE WITH OVERRIDE;
END
GO
EXEC LoneUser 'MyDatabase', 'app_user';
新版本不建議直接更新系統表,請改用:
USE MyDatabase;
GO
ALTER USER app_user WITH LOGIN = app_login; -- 重新對應登入
-- 或
EXEC sp_change_users_login 'Auto_Fix', 'app_user', NULL, 'new_password';
sysadmin 或 db_owner 權限。CREATE LOGIN 再執行修復。