因為選定的使用者擁有物件,所以無法移除該使用者。 (SQL 2000)
資料庫主體在該資料庫中擁有結構描述,無法刪除。 (SQL 2005+)
使用者擁有 結構描述 (Schema) 或 物件 (資料表/檢視/程序...) 的擁有權,SQL Server 禁止刪除擁有者以防止孤立物件。
dbo。sysusers → 開啟資料表 → 刪除目標使用者列。⚠️ 直接改系統表不支援、易損壞目錄,僅限極端情況且已完整備份時使用。
將該使用者擁有的所有使用者資料表擁有權轉移給 dbo,再刪除使用者。
USE [YourDB];
GO
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql += N'ALTER AUTHORIZATION ON ' + QUOTENAME(SCHEMA_NAME(schema_id)) + N'.' + QUOTENAME(name) + N' TO [dbo];' + CHAR(13)
FROM sys.objects
WHERE type = 'U' -- 僅使用者資料表
AND principal_id = USER_ID('TargetUser'); -- 目標使用者
PRINT @sql; -- 確認
EXEC sp_executesql @sql;
-- 若仍有結構描述殘留
-- DROP SCHEMA [TargetUser]; -- 確認無物件後執行
-- DROP USER [TargetUser];
sp_changeobjectowner 寫法 (SQL 2000/2005 相容,已棄用)USE [YourDB];
GO
DECLARE tb CURSOR LOCAL FOR
SELECT 'EXEC sp_changeobjectowner ''' + QUOTENAME(USER_NAME(uid)) + '.' + QUOTENAME(name) + ''', ''dbo'';'
FROM sysobjects
WHERE OBJECTPROPERTY(id, N'IsUserTable') = 1
AND uid <> USER_ID('dbo');
DECLARE @s NVARCHAR(4000);
OPEN tb;
FETCH NEXT FROM tb INTO @s;
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC (@s);
FETCH NEXT FROM tb INTO @s;
END
CLOSE tb; DEALLOCATE tb;
dbo。DROP USER [TargetUser]; 成功。現代版本 (2005+) 請優先使用 SSMS GUI + ALTER AUTHORIZATION,避免直接操作系統表。SQL 2000 環境若無 GUI 可用,謹慎使用游標腳本轉移擁有權。核心原則:**先解除擁有權,再刪除主體**。