在 SSMS 中嘗試刪除資料庫使用者時,彈出錯誤:「資料庫主體在該資料庫中擁有結構描述,無法刪除」 (錯誤 15138)。本文提供三種層層遞進的解決方案,從圖形介面到 T-SQL 腳本,徹底清除擁有權阻礙。
使用者擁有資料庫內的結構描述 或物件 (表、檢視、SP 等),SQL Server 禁止刪除擁有物件的主體,以防孤立物件產生。
dbo,或直接刪除空結構描述
-- 在目標資料庫執行
ALTER AUTHORIZATION ON SCHEMA::db_owner TO dbo;
-- 或針對特定結構描述
ALTER AUTHORIZATION ON SCHEMA::[UserSchema] TO dbo;
執行後重新整理,即可刪除使用者。
適用於大量物件、遷移資料庫、清理孤立使用者場景:
USE YourDatabaseName;
GO
DECLARE @sql NVARCHAR(MAX) = N'';
-- 1. 轉移結構描述擁有權 (非 dbo 的結構描述)
SELECT @sql += N'ALTER AUTHORIZATION ON SCHEMA::' + QUOTENAME(name) + N' TO dbo;'
FROM sys.schemas
WHERE principal_id <> SCHEMA_ID('dbo') AND name NOT IN ('sys', 'INFORMATION_SCHEMA');
-- 2. 轉移物件擁有權 (非 dbo 擁有的表、檢視、SP 等)
SELECT @sql += N'ALTER AUTHORIZATION ON OBJECT::' + QUOTENAME(s.name) + N'.' + QUOTENAME(o.name) + N' TO dbo;'
FROM sys.objects o
JOIN sys.schemas s ON o.schema_id = s.schema_id
WHERE o.principal_id IS NOT NULL
AND o.principal_id <> SCHEMA_ID('dbo')
AND o.type IN ('U', 'V', 'P', 'FN', 'IF', 'TF', 'TR');
-- 3. 執行動態 SQL
EXEC sp_executesql @sql;
GO
sysusers / sys.database_principals 中對應列風險:直接改系統表可能導致資料庫損壞、升級失敗、不受支援。嚴禁生產環境使用。
將資料庫從主機 A 備份還原到主機 B 後,常出現:
標準處理流程:
CREATE LOGIN NewUser WITH PASSWORD = '...';ALTER USER OldUser WITH LOGIN = NewUser; (或 sp_change_users_login 'update_one', 'OldUser', 'NewUser')EXEC sp_changeobjectowner 'OldUser.TableName', 'dbo'; 逐一轉移DROP USER OldUser;DROP LOGIN OldLogin;
-- 將 web102101 擁有的所有表轉給 dbo
EXEC sp_changeobjectowner 'web102101.Orders', 'dbo';
EXEC sp_changeobjectowner 'web102101.Customers', 'dbo';
-- ... 依此類推
轉移完成後,即可在「使用者」與「登入」節點刪除舊帳號。