SQL> DROP USER a CASCADE;
ORA-01940: cannot drop a user that is currently connected
原因:目標用戶存在活躍會話,Oracle 禁止刪除以防數據不一致。
SELECT username, sid, serial#, status, machine, program, logon_time
FROM v$session
WHERE username = 'A'; -- 目標用戶名
輸出示例:
| USERNAME | SID | SERIAL# | STATUS | MACHINE | PROGRAM |
|---|---|---|---|---|---|
| A | 9 | 4 | ACTIVE | APP-SERVER-01 | JDBC Thin Client |
-- 單個會話
ALTER SYSTEM KILL SESSION '9,4';
-- 批量終止該用戶所有會話(11g+)
BEGIN
FOR s IN (SELECT sid, serial# FROM v$session WHERE username = 'A') LOOP
EXECUTE IMMEDIATE 'ALTER SYSTEM KILL SESSION ''' || s.sid || ',' || s.serial# || ''' IMMEDIATE';
END LOOP;
END;
/
-- RAC 環境需指定實例
ALTER SYSTEM KILL SESSION '9,4,@1'; -- 在實例 1 上終止
IMMEDIATE 關鍵字作用:立即回滾事務、釋放鎖、斷開連接,無需等待客戶端確認。
-- 級聯刪除:同時刪除用戶擁有的所有對象(表、索引、序列等)
DROP USER a CASCADE;
現象:STATUS = 'KILLED' 但進程殘留,通常因長事務回滾中。
-- 1. 查詢回滾進度
SELECT s.username, t.used_ublk, t.used_urec,
ROUND(t.used_ublk * 8192 / 1024 / 1024, 2) rollback_mb
FROM v$session s, v$transaction t
WHERE s.saddr = t.ses_addr AND s.username = 'A';
-- 2. 等待回滾完成(不可強制中斷,否則數據不一致)
-- 可通過 SMON 進程監控:SELECT * FROM v$fast_start_transactions;
-- 切換到目標 PDB
ALTER SESSION SET CONTAINER = pdb1;
-- 執行標準流程
SELECT sid, serial# FROM v$session WHERE username = 'A';
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
DROP USER a CASCADE;
-- 查詢代理會話
SELECT s.username, s.proxy_user, s.sid, s.serial#
FROM v$session s
WHERE s.username = 'A' OR s.proxy_user = 'A';
-- 終止時需注意代理關係
validationQuery、testOnBorrow,應用重試機制吸收連接斷開#!/bin/bash
# drop_user.sh
TARGET_USER=$1
sqlplus -s / as sysdba <
AUDIT DROP USER 記錄操作審計ALTER SYSTEM 權限(通常 DBA 角色擁有)DROP USER 系統權限CASCADE 關鍵字或先手動刪除對象SELECT * FROM dba_users WHERE username = 'A'; 無記錄SELECT * FROM v$session WHERE username = 'A'; 無記錄SELECT * FROM dba_objects WHERE owner = 'A'; 無記錄SELECT * FROM dba_free_space WHERE tablespace_name = 'USERS'; 空間增加