3.

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';

削除前の安全チェック

  1. 該当ユーザーがアプリで使われていないか、接続情報(tnsnames・接続文字列)を grep
  2. v$session で接続セッションがないか確認
  3. スキーマ内オブジェクト一覧をエクスポート(expdp)してバックアップ
  4. 他スキーマからの参照(外部キー・ビュー・シノニム)を調査
  5. 本番ならアカウントロック → 一定期間放置 → 削除の二段階で進める
-- ステップ 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構文備考
OracleDROP USER ユーザー名 [CASCADE]スキーマと一体
MySQLDROP USER 'user'@'host'所有オブジェクトは別途削除が必要
PostgreSQLDROP USER ユーザー名 / DROP ROLE所有オブジェクトがあるとエラー、REASSIGN OWNED BYDROP OWNED BY で前処理
SQL ServerDROP 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 privilegesDROP 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 — 表領域削除
編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. ユーザー作成
  2. ユーザー定義変更
  3. ユーザー削除

最近更新/作成されたページ