在企業管理器或 T-SQL 嘗試修改 sa 密碼時,拋出錯誤:
錯誤 21776:[SQL-DMO] 名稱 'dbo' 在 Users 集合中...
dbo,對應 sysadmin 固定伺服器角色成員(通常是 sa)。dbo 對應的登入(SID)在新伺服器不存在,導致 dbo 成為孤立使用者(sys.database_principals 中 sid 無對應 sys.server_principals)。dbo 映射失效,為防止權限混亂,封鎖 sa 密碼變更等敏感操作。-- 檢查所有資料庫 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';
USE ProblemDatabase;
GO
EXEC sp_changedbowner 'sa'; -- 或其他有效 sysadmin 登入
GO
sp_changedbowner 會更新資料庫擁有者 SID,同步修正 dbo 映射。CREATE LOGIN。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;
sp_change_users_login 'Report' 掃描所有孤立使用者,包含 dbo。sp_help_revlogin)先在目標端建立相同 SID 登入,再還原資料庫。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)。