DROP USER username CASCADE;
DROP TABLESPACE user_tbs INCLUDING CONTENTS AND DATAFILES;
CASCADE:遞歸刪除用戶擁有的所有 Schema 物件(表、視圖、索引、序列、程序、觸發器、類型、同義詞等)。INCLUDING CONTENTS AND DATAFILES:同時刪除表空間內資料與作業系統層級資料檔,徹底釋放空間。適用場景:不想刪除用戶、只清空特定類型物件、需記錄刪除日誌、避開外鍵依賴順序問題。
DECLARE
TYPE name_arr IS TABLE OF VARCHAR2(128);
TYPE type_arr IS TABLE OF VARCHAR2(128);
v_names name_arr := name_arr();
v_types type_arr := type_arr();
v_sql VARCHAR2(500);
BEGIN
-- 1. 收集需刪除物件(排除 INDEX、LOB 由父物件級聯刪除)
v_sql := q'[
SELECT object_name, object_type
FROM user_objects
WHERE object_type NOT IN ('INDEX','LOB','LOB PARTITION','INDEX PARTITION')
ORDER BY
CASE object_type
WHEN 'TRIGGER' THEN 1
WHEN 'VIEW' THEN 2
WHEN 'PROCEDURE' THEN 3
WHEN 'FUNCTION' THEN 4
WHEN 'PACKAGE' THEN 5
WHEN 'TYPE' THEN 6
WHEN 'SEQUENCE' THEN 7
WHEN 'TABLE' THEN 8
ELSE 9
END
]';
EXECUTE IMMEDIATE v_sql BULK COLLECT INTO v_names, v_types;
-- 2. 依相依順序動態刪除
FOR i IN v_names.FIRST .. v_names.LAST LOOP
v_sql := 'DROP ' || v_types(i) || ' ' || v_names(i);
BEGIN
EXECUTE IMMEDIATE v_sql;
DBMS_OUTPUT.PUT_LINE('DROPPED: ' || v_types(i) || ' ' || v_names(i));
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('FAILED: ' || v_types(i) || ' ' || v_names(i)
|| ' - ' || SQLERRM);
END;
END LOOP;
END;
/
-- 執行後再手動 PURGE RECYCLEBIN 徹底釋放空間
-- 先停用所有外鍵
FOR c IN (SELECT constraint_name, table_name
FROM user_constraints
WHERE constraint_type = 'R') LOOP
EXECUTE IMMEDIATE 'ALTER TABLE ' || c.table_name
|| ' DISABLE CONSTRAINT ' || c.constraint_name;
END LOOP;
-- 執行上述刪除邏輯
-- 最後 PURGE RECYCLEBIN
| 維度 | DROP USER CASCADE | PL/SQL 動態腳本 |
|---|---|---|
| 適用場景 | 整用戶移除、環境重建 | 保留用戶清空物件、選擇性刪除、審計需求 |
| 執行速度 | 極快(內核級) | 較慢(逐條解析執行) |
| 依賴處理 | 自動級聯 | 需手動排序/停用 FK |
| 可控性 | 全或無 | 可過濾類型、記錄日誌、捕獲異常 |
| 權限需求 | DROP USER 系統權限 | 僅需對自身物件的 DROP 權限 |
首選 DROP USER CASCADE,標準、高效、無遺漏。保留用戶清空物件 時,使用帶有依賴排序、異常捕獲、日誌記錄的 PL/SQL 動態腳本。記得最後 PURGE RECYCLEBIN 或 PURGE DBA_RECYCLEBIN 徹底釋放空間。