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

SQL Server 錯誤 21776:dbo 使用者對應登入遺失導致無法修改 sa 密碼

     編輯:關於SqlServer

錯誤現象

在企業管理器或 T-SQL 嘗試修改 sa 密碼時,拋出錯誤:

錯誤 21776:[SQL-DMO] 名稱 'dbo' 在 Users 集合中...

根因分析

  • 每個資料庫內建特殊使用者 dbo,對應 sysadmin 固定伺服器角色成員(通常是 sa)。
  • 當資料庫備份還原至另一台伺服器,原 dbo 對應的登入(SID)在新伺服器不存在,導致 dbo 成為孤立使用者(sys.database_principals 中 sid 無對應 sys.server_principals)。
  • SQL Server 偵測到 dbo 映射失效,為防止權限混亂,封鎖 sa 密碼變更等敏感操作。

排查與修復步驟

1. 找出有問題的資料庫

-- 檢查所有資料庫 dbo 對應登入是否存在
SELECT 
    d.name AS DatabaseName,
    dp.name AS DBUser,
    dp.sid AS UserSID,
    sp.name AS LoginName,
    CASE WHEN sp.sid IS NULL THEN '孤立使用者' ELSE '正常' END AS Status
FROM sys.databases d
CROSS APPLY (
    SELECT name, sid FROM d.sys.database_principals WHERE name = 'dbo'
) dp
LEFT JOIN sys.server_principals sp ON dp.sid = sp.sid
WHERE d.state_desc = 'ONLINE';

2. 修復孤立 dbo(重新映射為現有登入)

USE ProblemDatabase;
GO
EXEC sp_changedbowner 'sa';  -- 或其他有效 sysadmin 登入
GO
  • sp_changedbowner 會更新資料庫擁有者 SID,同步修正 dbo 映射。
  • 若目標登入不存在,需先 CREATE LOGIN。

3. 批次修復腳本(所有受影響資料庫)

DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql = @sql + N'
USE [' + d.name + N'];
EXEC sp_changedbowner ''sa'';'
FROM sys.databases d
CROSS APPLY (
    SELECT sid FROM d.sys.database_principals WHERE name = 'dbo'
) dp
LEFT JOIN sys.server_principals sp ON dp.sid = sp.sid
WHERE d.state_desc = 'ONLINE' AND sp.sid IS NULL;

EXEC sp_executesql @sql;

預防措施

  1. 還原後立即執行 sp_change_users_login 'Report' 掃描所有孤立使用者,包含 dbo。
  2. 含登入的備份策略:跨伺服器遷移時,優先腳本化登入(sp_help_revlogin)先在目標端建立相同 SID 登入,再還原資料庫。
  3. 含資料庫擁有者:BACKUP DATABASE ... WITH CHECKSUM 並記錄擁有者資訊,還原後驗證。

相關知識點

  • sp_changedbowner 等同於 ALTER AUTHORIZATION ON DATABASE::[DB] TO [Login] (SQL Server 2005+ 推薦語法)。
  • 孤立使用者修復通用工具:sp_change_users_login 'Auto_Fix', 'User', NULL, 'Login'(dbo 無法用此工具,必須用 sp_changedbowner)。
  • 含資料庫還原的自動化部署管線,務必包含「登入同步 → 還原 → 擁有者修正 → 孤立使用者修復」四步驟。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved