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

SQL Server 2000/2005 無法刪除使用者完整解決方案:GUI、系統表與動態腳本三種方法

     編輯:關於SqlServer

    錯誤訊息

    因為選定的使用者擁有物件,所以無法移除該使用者。 (SQL 2000)
    資料庫主體在該資料庫中擁有結構描述,無法刪除。 (SQL 2005+)

    根本原因

    使用者擁有 結構描述 (Schema) 或 物件 (資料表/檢視/程序...) 的擁有權,SQL Server 禁止刪除擁有者以防止孤立物件。

    方法一:SSMS 圖形介面 (SQL 2005+ 推薦)

    1. 安全性 → 結構描述:找到該使用者同名結構描述 → 右鍵刪除 (若無物件) 或變更擁有者為 dbo。
    2. 安全性 → 使用者:刪除使用者 (此時應已無擁有權)。
    3. 若仍失敗,檢查 安全性 → 角色 → 資料庫角色:逐一編輯屬性,從成員清單移除該使用者。

    方法二:SQL 2000 企業管理員直接編輯系統表 (高風險,最後手段)

    1. 企業管理員 → 伺服器屬性 → 允許直接修改系統目錄 ✓。
    2. 展開資料庫 → 系統資料表 sysusers → 開啟資料表 → 刪除目標使用者列。
    3. 回使用者清單刪除使用者 → 重新加入正確對應。
    4. 務必關閉「允許直接修改系統目錄」。
    ⚠️ 直接改系統表不支援、易損壞目錄,僅限極端情況且已完整備份時使用。

    方法三:通用動態腳本 (SQL 2000/2005/2008+ 通用)

    將該使用者擁有的所有使用者資料表擁有權轉移給 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 可用,謹慎使用游標腳本轉移擁有權。核心原則:**先解除擁有權,再刪除主體**。

    1. 上一篇文章:
    2. 下一篇文章:
    Copyright © 程式碼之家 All Rights Reserved