タイトル: ユーザー削除
SEOタイトル: Oracle DROP USERでユーザー削除|CASCADE・接続中ユーザーの対処
| この記事の要点 |
- Oracle でユーザー(=スキーマ)を削除するには
DROP USER ユーザー名 - スキーマオブジェクトを保有するユーザーは
CASCADE を付けないと削除できない - 実行には DROP USER システム権限 が必要(SYSDBA または同等の DBA ロール)
- 接続中のセッションがあるユーザーは削除不可。
ALTER SYSTEM KILL SESSION で切断してから実行 - 同等の操作は MySQL
DROP USER、PostgreSQL DROP USER / DROP ROLE、SQL Server DROP USER / DROP LOGIN
|
はじめに
Oracle のユーザーはスキーマと一対一で、ユーザーを削除するとそのスキーマに属する表・ビュー・索引・PL/SQL もまとめて影響を受けます。本番環境では誤操作が致命傷になりやすい操作なので、構文だけでなく前提条件・影響範囲を理解しておきましょう。
基本構文
DROP USER ユーザー名 [CASCADE];
| オプション | 意味 |
| なし | スキーマオブジェクトがある場合はエラーで停止 |
CASCADE | スキーマ内の全オブジェクト(表・ビュー・索引・PL/SQL など)も一緒に削除 |
基本例
-- オブジェクトを持たないユーザーをそのまま削除
DROP USER test_user;
-- 表などを保有しているユーザーは CASCADE 必須
DROP USER app_user CASCADE;
必要な権限
DROP USER システム権限(DBA ロールに含まれる)
- 自分自身のユーザーは削除不可(接続中のため)
- SYS / SYSTEM のようなシステム予約ユーザーは削除禁止
-- DBA ロールで接続して実行
SQL> CONNECT sys/password AS SYSDBA;
SQL> DROP USER app_user CASCADE;
接続中ユーザーの扱い
削除しようとしたユーザーで誰かが接続していると ORA-01940: cannot drop a user that is currently connected が出ます。次の手順で対処します。
-- 1) 接続セッションを確認
SELECT sid, serial#, username, status, program
FROM v$session
WHERE username = 'APP_USER';
-- 2) セッションを切断(sid, serial# は前の結果から)
ALTER SYSTEM KILL SESSION '123,456' IMMEDIATE;
-- 3) 念のためアカウントをロックしておく
ALTER USER app_user ACCOUNT LOCK;
-- 4) 改めて削除
DROP USER app_user CASCADE;
CASCADE で削除されるもの
| 対象 | 備考 |
| 表 / ビュー / マテリアライズドビュー | 当該スキーマのもの全て |
| 索引 / シーケンス / シノニム | 同上 |
| PL/SQL(プロシージャ / 関数 / パッケージ) | 同上 |
| トリガー | 同上 |
| 表領域上の物理データ | 領域は表領域に返却される |
| 外部から参照しているビュー / シノニム | 無効化(INVALID)になる |
| 外部から参照している外部キー | 削除されない、エラーになる場合あり |
削除対象スキーマの表を、他スキーマの外部キーが参照している場合は CASCADE でも自動解決できないことがあります。事前に依存関係を調査してください。
-- 他スキーマからの参照を調査
SELECT owner, constraint_name, table_name, r_owner, r_constraint_name
FROM dba_constraints
WHERE constraint_type = 'R'
AND r_owner = 'APP_USER';
削除前の安全チェック
- 該当ユーザーがアプリで使われていないか、接続情報(tnsnames・接続文字列)を grep
v$session で接続セッションがないか確認
- スキーマ内オブジェクト一覧をエクスポート(
expdp)してバックアップ
- 他スキーマからの参照(外部キー・ビュー・シノニム)を調査
- 本番ならアカウントロック → 一定期間放置 → 削除の二段階で進める
-- ステップ 1: アカウントロックで利用停止
ALTER USER app_user ACCOUNT LOCK;
-- 数日〜数週間運用して問題なし → ステップ 2 で削除
DROP USER app_user CASCADE;
表領域とユーザー削除の関係
ユーザーを削除しても表領域(TABLESPACE)自体は残ります。ユーザーが使用していたセグメントは解放され、表領域内の空き領域として再利用可能になります。表領域も削除したい場合は、別途 DROP TABLESPACE 文が必要です。
-- ユーザー削除後に、不要になった表領域も削除
DROP TABLESPACE app_data INCLUDING CONTENTS AND DATAFILES;
他 DBMS との比較
| DBMS | 構文 | 備考 |
| Oracle | DROP USER ユーザー名 [CASCADE] | スキーマと一体 |
| MySQL | DROP USER 'user'@'host' | 所有オブジェクトは別途削除が必要 |
| PostgreSQL | DROP USER ユーザー名 / DROP ROLE | 所有オブジェクトがあるとエラー、REASSIGN OWNED BY や DROP OWNED BY で前処理 |
| SQL Server | DROP USER ユーザー名; + DROP LOGIN ログイン名; | ユーザーとログインを分けて削除 |
よくあるトラブル
| エラー | 原因 / 対処 |
ORA-01922: CASCADE must be specified to drop ... | オブジェクトが残っている。CASCADE を付与 |
ORA-01940: cannot drop a user that is currently connected | 接続中。ALTER SYSTEM KILL SESSION で切断 |
ORA-01031: insufficient privileges | DROP USER 権限がない。DBA ロールを持つ管理者で実行 |
ORA-02429: cannot drop index used for enforcement of unique/primary key | 他スキーマから参照される一意制約がある。先に参照側の外部キーを削除 |
| 削除後にビューが INVALID | 他スキーマのビューが参照していた。ALTER VIEW ... COMPILE で再コンパイル不能なら作り直し |
関連
- ユーザー関連 — 親カテゴリ
- CREATE USER — ユーザー作成
- ALTER USER — パスワード変更・アカウントロック
- GRANT / REVOKE — 権限付与・剥奪
- DROP TABLESPACE — 表領域削除