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

修復孤立使用者的預存程序:同步 SID 至資料庫使用者

     編輯:關於SqlServer

什麼是孤立使用者

當資料庫還原至不同伺服器,或登入被刪除重建後,資料庫內的使用者 (sysusers) 與伺服器登入 (syslogins) 的 SID 不匹配,導致使用者無法登入該資料庫,即為「孤立使用者」。

解決方案:預存程序 LoneUser

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';

現代版本(SQL Server 2005+)建議做法

新版本不建議直接更新系統表,請改用:

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 再執行修復。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved