【完全版】Oracle Databaseでユーザー一覧を取得する全方法

【完全版】Oracle Databaseでユーザー一覧を取得する全方法

「Oracleでユーザー一覧を取得したい」――この要件は、データベース運用・セキュリティ監査・棚卸し作業など、現場で頻繁に発生します。しかし、単に SELECT * FROM ALL_USERS; を実行するだけでは、実務で必要な情報の半分も取得できません。

  • ロック状態・パスワード期限切れアカウントを抽出したい
  • 最終ログイン日時を確認して未使用ユーザーを棚卸ししたい
  • 各ユーザーが持っている権限・ロールも一覧化したい
  • マルチテナント(CDB/PDB)環境で全ユーザーを横断的に把握したい
  • Oracle標準ユーザーと自社作成ユーザーを区別したい

本記事では、Oracle Databaseでユーザー一覧を取得するすべての方法を、実務でそのまま使えるSQL集として整理します。USER_USERS・ALL_USERS・DBA_USERS・CDB_USERSの違いから、権限・ロール・最終ログイン・パスワードポリシー込みの実践クエリ、SQL Developer/A5:SQL Mk-2のGUI操作、セキュリティ監査用SQL、CSV出力まで完全網羅。この1本でユーザー管理の悩みが解消します。


目次

結論:とにかく今すぐ知りたい人向けの3パターン

時間がない方向けに、最頻出の3パターンを先に示します。

①ユーザー名の一覧だけ欲しい

SELECT USERNAME FROM ALL_USERS ORDER BY USERNAME;

②全ユーザー+状態(DBA権限あり)

SELECT USERNAME, ACCOUNT_STATUS, CREATED, LAST_LOGIN
FROM DBA_USERS
ORDER BY USERNAME;

③現在ログイン中の自分のアカウントを確認

SHOW USER
-- または
SELECT USER FROM DUAL;

詳細な使い分けと応用クエリは以下で順に解説します。


まず押さえるべき:USER_USERS / ALL_USERS / DBA_USERS / CDB_USERS の違い

Oracleには、ユーザー情報を取得するためのデータディクショナリビューが4種類あります。取得できる範囲・カラム数・必要権限がそれぞれ異なります

ビュー名取得範囲必要権限主なカラム数
USER_USERS自分自身のユーザー情報のみ不要少(個人情報のみ)
ALL_USERSデータベース上の全ユーザー(一覧表示用、基本情報のみ)不要少(USERNAME、USER_ID、CREATED等)
DBA_USERSデータベース上の全ユーザー(詳細情報含む)DBA権限または SELECT_CATALOG_ROLE多(パスワード関連・期限・テーブルスペース等を含む)
CDB_USERS**CDB全体(全PDB)**のユーザーDBA権限 + CDBルート接続多(CON_ID付き)

使い分けの指針

  • 一般ユーザーが自分の情報を見たいUSER_USERS
  • アプリ開発で他ユーザーの存在確認ALL_USERS
  • DBA・運用が詳細管理DBA_USERS
  • マルチテナント全体を管理CDB_USERS

ALL_USERSとDBA_USERSの取得情報の差

ALL_USERS から取得できるのは基本情報のみで、以下の重要情報は DBA_USERS でしか取れません:

  • ACCOUNT_STATUS: アカウント状態(OPEN/LOCKED/EXPIREDなど)
  • EXPIRY_DATE: パスワード有効期限
  • DEFAULT_TABLESPACE: デフォルト表領域
  • TEMPORARY_TABLESPACE: 一時表領域
  • PROFILE: 適用プロファイル
  • LAST_LOGIN: 最終ログイン日時(12c以降)
  • AUTHENTICATION_TYPE: 認証方式(PASSWORD/EXTERNAL/GLOBAL)
  • COMMON: 共通ユーザーフラグ(CDB環境)
  • ORACLE_MAINTAINED: Oracle標準ユーザーかどうか

基本パターン:シンプルなユーザー一覧取得

自分自身のユーザー情報

SELECT * FROM USER_USERS;

全ユーザーの基本情報

SELECT USERNAME, USER_ID, CREATED 
FROM ALL_USERS 
ORDER BY USERNAME;

全ユーザーの詳細情報(DBA権限必要)

SELECT USERNAME, ACCOUNT_STATUS, CREATED, DEFAULT_TABLESPACE, PROFILE 
FROM DBA_USERS 
ORDER BY USERNAME;

CDB全体のユーザー一覧(マルチテナント)

SELECT CON_ID, USERNAME, ACCOUNT_STATUS, COMMON 
FROM CDB_USERS 
ORDER BY CON_ID, USERNAME;

現在のログインユーザーを確認する

SHOW USER(SQL*Plus/SQL Developer専用)

SHOW USER

実行結果:

USER is "SYSTEM"

SELECT USER FROM DUAL

SELECT USER FROM DUAL;

SYS_CONTEXT で詳細なセッション情報

SELECT 
    SYS_CONTEXT('USERENV', 'SESSION_USER') AS SESSION_USER,
    SYS_CONTEXT('USERENV', 'CURRENT_USER') AS CURRENT_USER,
    SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA') AS CURRENT_SCHEMA,
    SYS_CONTEXT('USERENV', 'OS_USER') AS OS_USER,
    SYS_CONTEXT('USERENV', 'HOST') AS HOST,
    SYS_CONTEXT('USERENV', 'IP_ADDRESS') AS IP_ADDRESS,
    SYS_CONTEXT('USERENV', 'CON_NAME') AS CONTAINER_NAME
FROM DUAL;

セキュリティ監査や接続元調査で重要な情報をまとめて取得できます。


アカウント状態で絞り込む

ACCOUNT_STATUS カラムには複数の状態があり、組み合わさることもあります。

主なアカウント状態

ステータス意味
OPEN利用可能
LOCKED管理者によりロック
LOCKED(TIMED)パスワード誤入力による自動ロック
EXPIREDパスワード期限切れ
EXPIRED(GRACE)期限切れ警告中(猶予期間)
EXPIRED & LOCKED期限切れかつロック
EXPIRED(GRACE) & LOCKED(TIMED)期限切れ警告中かつ自動ロック

有効なユーザーのみ抽出

SELECT USERNAME 
FROM DBA_USERS 
WHERE ACCOUNT_STATUS = 'OPEN'
ORDER BY USERNAME;

ロックされているユーザー

SELECT USERNAME, ACCOUNT_STATUS, LOCK_DATE 
FROM DBA_USERS 
WHERE ACCOUNT_STATUS LIKE '%LOCKED%'
ORDER BY LOCK_DATE DESC;

パスワード期限切れユーザー

SELECT USERNAME, ACCOUNT_STATUS, EXPIRY_DATE 
FROM DBA_USERS 
WHERE ACCOUNT_STATUS LIKE '%EXPIRED%'
ORDER BY EXPIRY_DATE;

あと7日以内に期限切れになるユーザー

SELECT USERNAME, EXPIRY_DATE 
FROM DBA_USERS 
WHERE EXPIRY_DATE BETWEEN SYSDATE AND SYSDATE + 7
  AND ACCOUNT_STATUS = 'OPEN'
ORDER BY EXPIRY_DATE;

期限切れによる業務停止を未然に防ぐためのモニタリングクエリです。


最終ログイン日時を確認する(12c以降)

Oracle 12c以降では、DBA_USERSLAST_LOGIN 列が追加され、各ユーザーの最終ログイン日時が記録されます。

全ユーザーの最終ログインを新しい順に表示

SELECT USERNAME, ACCOUNT_STATUS, CREATED, LAST_LOGIN 
FROM DBA_USERS 
ORDER BY LAST_LOGIN DESC NULLS LAST;

90日以上ログインがないユーザー(休眠アカウント)

SELECT USERNAME, LAST_LOGIN, CREATED 
FROM DBA_USERS 
WHERE LAST_LOGIN < SYSDATE - 90 
   OR LAST_LOGIN IS NULL
ORDER BY LAST_LOGIN NULLS FIRST;

セキュリティ監査で必須の「未使用アカウント検出」用クエリです。退職者・元委託先アカウントの棚卸しに使えます。

一度もログインしていないユーザー

SELECT USERNAME, CREATED 
FROM DBA_USERS 
WHERE LAST_LOGIN IS NULL
  AND ACCOUNT_STATUS = 'OPEN';

Oracle標準ユーザーを除外して自社ユーザーのみ抽出

DBA_USERS を素のまま見ると、SYS・SYSTEM・OUTLN・APPQOSSYS等のOracle標準ユーザーが大量に表示されて見づらくなります。これらを除外する方法です。

ORACLE_MAINTAINED列を使う(12c以降の推奨方法)

SELECT USERNAME, ACCOUNT_STATUS, CREATED 
FROM DBA_USERS 
WHERE ORACLE_MAINTAINED = 'N'
ORDER BY USERNAME;

ORACLE_MAINTAINED = 'N' が「Oracle管理対象外」、つまりユーザーが自分で作成したアカウントを意味します。新しいOracle標準ユーザーが追加されても自動的に除外されるため、将来の互換性が高い方法です。

主要システムスキーマを明示的に除外

11g以前の古い環境や、特定のシステムユーザーだけ含めたい場合:

SELECT USERNAME, ACCOUNT_STATUS 
FROM DBA_USERS 
WHERE USERNAME NOT IN (
    'SYS', 'SYSTEM', 'OUTLN', 'DBSNMP', 'APPQOSSYS', 
    'XDB', 'CTXSYS', 'MDSYS', 'ORDDATA', 'WMSYS',
    'GSMADMIN_INTERNAL', 'OJVMSYS', 'LBACSYS',
    'AUDSYS', 'DVSYS', 'OLAPSYS', 'ORACLE_OCM',
    'ANONYMOUS', 'APEX_PUBLIC_USER', 'FLOWS_FILES',
    'REMOTE_SCHEDULER_AGENT', 'XS$NULL'
)
ORDER BY USERNAME;

特定ユーザーを検索する

完全一致

SELECT * FROM DBA_USERS WHERE USERNAME = 'HR';

⚠️ 大文字小文字の注意: Oracleではユーザー名は内部的に大文字で管理されます。hr ではなく HR で検索してください。

部分一致

SELECT USERNAME 
FROM DBA_USERS 
WHERE USERNAME LIKE 'APP%'
ORDER BY USERNAME;

大小文字を無視した検索

SELECT USERNAME 
FROM DBA_USERS 
WHERE UPPER(USERNAME) LIKE '%ADMIN%'
ORDER BY USERNAME;

正規表現検索

SELECT USERNAME 
FROM DBA_USERS 
WHERE REGEXP_LIKE(USERNAME, '^(APP|BATCH)_USER[0-9]+$')
ORDER BY USERNAME;

ユーザー数を集計する

全ユーザー数

SELECT COUNT(*) AS USER_COUNT FROM DBA_USERS;

状態別のユーザー数

SELECT ACCOUNT_STATUS, COUNT(*) AS USER_COUNT 
FROM DBA_USERS 
GROUP BY ACCOUNT_STATUS 
ORDER BY USER_COUNT DESC;

Oracle標準 vs 自社作成ユーザーの内訳

SELECT 
    CASE WHEN ORACLE_MAINTAINED = 'Y' THEN 'Oracle標準'
         ELSE '自社作成'
    END AS USER_TYPE,
    COUNT(*) AS USER_COUNT
FROM DBA_USERS
GROUP BY ORACLE_MAINTAINED;

プロファイル別のユーザー数

SELECT PROFILE, COUNT(*) AS USER_COUNT 
FROM DBA_USERS 
GROUP BY PROFILE 
ORDER BY USER_COUNT DESC;

【実践】権限・ロール込みでユーザー一覧を取得する

各ユーザーに付与されたロール

SELECT 
    GRANTEE AS USERNAME,
    GRANTED_ROLE,
    ADMIN_OPTION,
    DEFAULT_ROLE
FROM DBA_ROLE_PRIVS
WHERE GRANTEE NOT IN (
    SELECT USERNAME FROM DBA_USERS WHERE ORACLE_MAINTAINED = 'Y'
)
ORDER BY GRANTEE, GRANTED_ROLE;

各ユーザーの保有ロールをまとめて表示

SELECT 
    GRANTEE AS USERNAME,
    LISTAGG(GRANTED_ROLE, ', ') WITHIN GROUP (ORDER BY GRANTED_ROLE) AS ROLES
FROM DBA_ROLE_PRIVS
GROUP BY GRANTEE
ORDER BY GRANTEE;

システム権限を持つユーザー一覧

SELECT 
    GRANTEE AS USERNAME,
    PRIVILEGE,
    ADMIN_OPTION
FROM DBA_SYS_PRIVS
WHERE GRANTEE IN (
    SELECT USERNAME FROM DBA_USERS WHERE ORACLE_MAINTAINED = 'N'
)
ORDER BY GRANTEE, PRIVILEGE;

DBA権限を持つユーザー(要注意ユーザー)

SELECT GRANTEE AS USERNAME, GRANTED_ROLE, ADMIN_OPTION 
FROM DBA_ROLE_PRIVS 
WHERE GRANTED_ROLE = 'DBA'
ORDER BY GRANTEE;

セキュリティ監査で必ず確認すべきクエリです。DBA権限を持つアカウントは最小限にすべきです。

オブジェクト権限を持つユーザー

SELECT 
    GRANTEE AS USERNAME,
    OWNER || '.' || TABLE_NAME AS OBJECT_NAME,
    PRIVILEGE
FROM DBA_TAB_PRIVS
WHERE GRANTEE NOT IN (
    SELECT USERNAME FROM DBA_USERS WHERE ORACLE_MAINTAINED = 'Y'
)
ORDER BY GRANTEE;

認証方式・パスワード情報を確認する

認証方式別の一覧

SELECT USERNAME, AUTHENTICATION_TYPE, ACCOUNT_STATUS 
FROM DBA_USERS 
ORDER BY AUTHENTICATION_TYPE, USERNAME;

AUTHENTICATION_TYPE の値:

  • PASSWORD: 通常のパスワード認証
  • EXTERNAL: OS認証
  • GLOBAL: ディレクトリサービス認証

デフォルトパスワードのまま放置されているユーザー(要対処)

SELECT * FROM DBA_USERS_WITH_DEFPWD;

Oracleが既知のデフォルトパスワードを使っているアカウントを抽出する専用ビューです。セキュリティ監査で最優先で確認すべき項目です。該当アカウントがあれば即座にパスワード変更してください。

パスワードの最終更新日

SELECT 
    USERNAME,
    PASSWORD_CHANGE_DATE,
    EXPIRY_DATE,
    ACCOUNT_STATUS
FROM DBA_USERS
WHERE ORACLE_MAINTAINED = 'N'
ORDER BY PASSWORD_CHANGE_DATE NULLS FIRST;

プロファイルとリソース制限を確認する

各ユーザーには「プロファイル」が割り当てられ、パスワードポリシーやリソース制限が定義されます。

各ユーザーのプロファイル

SELECT USERNAME, PROFILE 
FROM DBA_USERS 
ORDER BY PROFILE, USERNAME;

プロファイルの内容を確認

SELECT * FROM DBA_PROFILES 
WHERE PROFILE = 'DEFAULT'
ORDER BY RESOURCE_TYPE, RESOURCE_NAME;

ユーザーごとに有効になっているパスワードポリシー

SELECT 
    u.USERNAME,
    u.PROFILE,
    p.RESOURCE_NAME,
    p.LIMIT
FROM DBA_USERS u
JOIN DBA_PROFILES p ON u.PROFILE = p.PROFILE
WHERE p.RESOURCE_TYPE = 'PASSWORD'
  AND u.ORACLE_MAINTAINED = 'N'
ORDER BY u.USERNAME, p.RESOURCE_NAME;

デフォルト表領域・一時表領域を確認する

SELECT 
    USERNAME,
    DEFAULT_TABLESPACE,
    TEMPORARY_TABLESPACE,
    PROFILE
FROM DBA_USERS
WHERE ORACLE_MAINTAINED = 'N'
ORDER BY DEFAULT_TABLESPACE, USERNAME;

表領域別のユーザー数

SELECT DEFAULT_TABLESPACE, COUNT(*) AS USER_COUNT 
FROM DBA_USERS 
GROUP BY DEFAULT_TABLESPACE 
ORDER BY USER_COUNT DESC;

CDB/PDB環境でのユーザー一覧

マルチテナント環境では、ユーザーが「コモンユーザー(CDB全体)」と「ローカルユーザー(特定PDB内のみ)」に分類されます。

コモンユーザー一覧(C##プレフィックス)

SELECT USERNAME, COMMON, CON_ID 
FROM CDB_USERS 
WHERE COMMON = 'YES'
ORDER BY USERNAME;

ローカルユーザー一覧

SELECT CON_ID, USERNAME 
FROM CDB_USERS 
WHERE COMMON = 'NO'
  AND ORACLE_MAINTAINED = 'N'
ORDER BY CON_ID, USERNAME;

PDB別のユーザー数

SELECT 
    p.NAME AS PDB_NAME,
    COUNT(u.USERNAME) AS USER_COUNT
FROM V$PDBS p
LEFT JOIN CDB_USERS u ON p.CON_ID = u.CON_ID
WHERE u.ORACLE_MAINTAINED = 'N' OR u.ORACLE_MAINTAINED IS NULL
GROUP BY p.NAME
ORDER BY p.NAME;

現在の接続コンテナを確認

SHOW CON_NAME
-- または
SELECT SYS_CONTEXT('USERENV', 'CON_NAME') FROM DUAL;

現在接続中のセッション一覧(V$SESSION)

「登録されているユーザー」ではなく「今ログインしている人」を見たい場合は V$SESSION を使います。

接続中のユーザーセッション

SELECT 
    USERNAME,
    SID,
    SERIAL#,
    STATUS,
    OSUSER,
    MACHINE,
    PROGRAM,
    LOGON_TIME
FROM V$SESSION
WHERE USERNAME IS NOT NULL
ORDER BY LOGON_TIME DESC;

ユーザー別の現在のセッション数

SELECT USERNAME, COUNT(*) AS SESSION_COUNT 
FROM V$SESSION 
WHERE USERNAME IS NOT NULL 
GROUP BY USERNAME 
ORDER BY SESSION_COUNT DESC;

アイドル時間が長いセッション

SELECT 
    USERNAME,
    SID,
    SERIAL#,
    STATUS,
    LAST_CALL_ET / 60 AS IDLE_MINUTES
FROM V$SESSION
WHERE STATUS = 'INACTIVE'
  AND USERNAME IS NOT NULL
ORDER BY LAST_CALL_ET DESC;

長時間アイドル状態のセッション切断判断に使えます。


【セキュリティ監査】チェックリストSQL集

セキュリティ監査でよく使われる定型クエリをまとめます。

①デフォルトパスワードの確認

SELECT * FROM DBA_USERS_WITH_DEFPWD;

②DBA権限を持つユーザー

SELECT GRANTEE FROM DBA_ROLE_PRIVS WHERE GRANTED_ROLE = 'DBA';

③長期未使用ユーザー(90日以上)

SELECT USERNAME, LAST_LOGIN 
FROM DBA_USERS 
WHERE LAST_LOGIN < SYSDATE - 90 AND ACCOUNT_STATUS = 'OPEN';

④パスワード無期限ユーザー

SELECT u.USERNAME, p.LIMIT AS PASSWORD_LIFE_TIME
FROM DBA_USERS u
JOIN DBA_PROFILES p ON u.PROFILE = p.PROFILE
WHERE p.RESOURCE_NAME = 'PASSWORD_LIFE_TIME'
  AND p.LIMIT IN ('UNLIMITED', 'DEFAULT');

⑤UNLIMITED TABLESPACEを持つユーザー

SELECT GRANTEE 
FROM DBA_SYS_PRIVS 
WHERE PRIVILEGE = 'UNLIMITED TABLESPACE';

⑥SYSDBA/SYSOPER権限保持者

SELECT * FROM V$PWFILE_USERS;

これらを定期的に実行することで、セキュリティリスクを早期発見できます。


GUIツールでユーザー一覧を確認する

SQL Developer

  1. 接続を作成して接続
  2. ツリーから「他のユーザー」を展開
  3. 全ユーザー一覧が表示される
  4. 各ユーザーをクリックすると詳細情報(権限・ロール・オブジェクト所有)も確認可能

表示」→「DBA」→ DBA接続を追加すると、より詳細な管理ビューが使えます。

A5:SQL Mk-2

  1. データベースに接続
  2. ツリーの「ユーザー(スキーマ)」を展開
  3. 一覧が表示される

ツール」→「システム管理」→「ユーザー一覧」でも詳細情報を確認できます。

SQL Developer Web(APEX付属)

ブラウザ経由のOracle純正ツールでも、SQL Workshopから上記SQLを実行して一覧化できます。


CSVファイルにユーザー一覧をエクスポートする

SQL*Plus

SET MARKUP CSV ON
SET FEEDBACK OFF
SET HEADING ON
SPOOL user_list.csv

SELECT USERNAME, ACCOUNT_STATUS, CREATED, LAST_LOGIN, DEFAULT_TABLESPACE, PROFILE 
FROM DBA_USERS 
WHERE ORACLE_MAINTAINED = 'N'
ORDER BY USERNAME;

SPOOL OFF

SQL Developer

  1. クエリを実行
  2. 結果セットを右クリック→「エクスポート
  3. 形式に「CSV」または「xlsx」を選択

プログラム言語からユーザー一覧を取得する

Python(python-oracledb)

import oracledb

conn = oracledb.connect(
    user="system",
    password="password",
    dsn="localhost:1521/XEPDB1"
)
cursor = conn.cursor()

cursor.execute("""
    SELECT USERNAME, ACCOUNT_STATUS, CREATED, LAST_LOGIN
    FROM DBA_USERS
    WHERE ORACLE_MAINTAINED = 'N'
    ORDER BY USERNAME
""")

for username, status, created, last_login in cursor:
    print(f"{username:30} | {status:20} | {created} | {last_login}")

cursor.close()
conn.close()

Java(JDBC)

String sql = "SELECT USERNAME, ACCOUNT_STATUS FROM DBA_USERS WHERE ORACLE_MAINTAINED = 'N'";
try (PreparedStatement ps = conn.prepareStatement(sql);
     ResultSet rs = ps.executeQuery()) {
    while (rs.next()) {
        System.out.printf("%-30s %s%n",
            rs.getString("USERNAME"),
            rs.getString("ACCOUNT_STATUS"));
    }
}

Node.js(node-oracledb)

const oracledb = require('oracledb');

async function listUsers() {
    const conn = await oracledb.getConnection({
        user: "system",
        password: "password",
        connectString: "localhost:1521/XEPDB1"
    });
    const result = await conn.execute(`
        SELECT USERNAME, ACCOUNT_STATUS, LAST_LOGIN
        FROM DBA_USERS
        WHERE ORACLE_MAINTAINED = 'N'
        ORDER BY USERNAME
    `);
    result.rows.forEach(row => console.log(row));
    await conn.close();
}

listUsers();

用途別:使い分けクイックリファレンス

やりたいこと推奨方法
自分のアカウントを知るSHOW USER
ユーザー名だけリスト化SELECT USERNAME FROM ALL_USERS
詳細情報込みで全ユーザーSELECT * FROM DBA_USERS(要権限)
自社作成ユーザーのみWHERE ORACLE_MAINTAINED = 'N'
未使用アカウント検出LAST_LOGIN < SYSDATE - 90
ロック中ユーザーACCOUNT_STATUS LIKE '%LOCKED%'
パスワード期限切れ前検出EXPIRY_DATE BETWEEN SYSDATE AND SYSDATE + 7
権限付きでDBA_ROLE_PRIVS / DBA_SYS_PRIVS JOIN
接続中セッションV$SESSION
マルチテナント全体CDB_USERS
デフォルトパスワード検出SELECT * FROM DBA_USERS_WITH_DEFPWD

ユーザーとスキーマの違いを理解する

Oracleでは「ユーザー」と「スキーマ」は厳密には別概念ですが、多くの場合1対1で対応します。

概念意味
ユーザーログインアカウント。認証情報を持つ
スキーマユーザーが所有するオブジェクト(テーブル、ビュー等)の集合

ユーザーを作成すると、同名のスキーマが自動的に作成されます。DBA_USERS で取得されるのはユーザーの一覧、USER_TABLES 等で「スキーマ」と呼ばれているのはそのユーザーが所有するオブジェクト群を指します。


よくある質問(FAQ)

Q1. ALL_USERSとDBA_USERSの違いは結局何ですか?

ALL_USERS は権限不要で全ユーザーを参照できますが、取得できるのは USERNAMEUSER_IDCREATED などの 基本情報のみ です。DBA_USERS はDBA権限が必要ですが、ACCOUNT_STATUSLAST_LOGINDEFAULT_TABLESPACEPROFILE など 管理に必要な詳細情報 をすべて取得できます。

Q2. ORA-00942(表またはビューが存在しません)が出ます

DBA_USERSやCDB_USERSへのアクセスには権限が必要です。以下を実行して権限付与してください:

GRANT SELECT_CATALOG_ROLE TO your_user;

権限がない場合は ALL_USERS を使ってください。

Q3. LAST_LOGINが空欄のユーザーがいます

考えられる理由:

  • そのユーザーは一度もログインしていない
  • データベースが12c以前LAST_LOGIN 列をサポートしていない
  • ユーザーがOSベース認証(EXTERNAL)で接続しており、Oracleが記録していない

12c以降で対象ユーザーが利用されているはずなのに LAST_LOGIN が空欄なら、アプリケーションがプールから既存セッションを再利用している可能性も考えられます。

Q4. ユーザー名を小文字で作成したのに大文字で表示される

これは仕様です。CREATE USER hr のようにクォートなしで作成すると、Oracleは内部的に大文字 HR として管理します。小文字のまま使うには:

CREATE USER "hr" IDENTIFIED BY password;

二重引用符で囲んで作成する必要がありますが、移植性とSQL記述の煩雑さの観点から非推奨です。

Q5. CDB_USERSとDBA_USERSの違いは?

  • DBA_USERS: 接続中の単一コンテナ(PDBまたはCDBルート)のユーザー
  • CDB_USERS: **CDB全体(全PDB横断)**のユーザー。CON_ID 列付き

CDBルートに接続してから CDB_USERS を使うのが基本です。

Q6. C##で始まるユーザーは何ですか?

C## プレフィックスは コモンユーザー(CDB環境で全PDBに共通して存在するユーザー)の命名規約です。Oracle標準では、CDBルートでユーザーを作成する場合 C## または C##_ プレフィックスが必須です。

Q7. SYSとSYSTEMの違いは?

両方ともOracle標準の管理ユーザーですが:

  • SYS: データベースの所有者。SYSDBA権限。データディクショナリの所有者
  • SYSTEM: 一般管理者。DBAロールが付与されている

SYSはOracle内部で特別扱いされるため、通常の管理作業は SYSTEMまたは別の管理者ユーザーで実施するのが推奨されます。

Q8. ユーザー一覧をExcelで管理したいです

SQL Developerで一覧クエリを実行 → 結果セット右クリック → 「エクスポート」 → 形式「xlsx」 で直接Excelファイルとして保存できます。

Q9. 削除されたユーザーの履歴を確認できますか?

DBA_USERS には現存するユーザーのみが表示されます。削除履歴は 監査ログ(DBA_AUDIT_TRAIL、Unified Audit Trail) で追跡できます。監査が有効になっていない場合は履歴を遡れません。

Q10. ユーザー一覧の取得が遅いのはなぜ?

DBA_USERS 自体は高速ですが、以下のJOIN系クエリは遅くなる可能性があります:

  • V$SESSION との結合(リアルタイムビューのため負荷大)
  • DBA_OBJECTS との結合(オブジェクト数による)
  • DBA_TAB_PRIVS との結合(権限数による)

大規模DBでは、まず単純な DBA_USERS クエリで対象ユーザーを絞り込んでから、必要な情報をJOINするのが効率的です。


まとめ

Oracle Databaseでのユーザー一覧取得は、目的に応じて適切なビューと条件を組み合わせることが重要です。

  • 基本4ビューを使い分け: USER_USERS / ALL_USERS / DBA_USERS / CDB_USERS
  • Oracle標準ユーザー除外: ORACLE_MAINTAINED = 'N' が最も安全
  • セキュリティ監査: DBA_USERS_WITH_DEFPWDLAST_LOGINDBA_ROLE_PRIVS を組み合わせて定期チェック
  • マルチテナント: CDB_USERS で全PDBを横断確認
  • 接続中ユーザー: V$SESSION を使う(DBA_USERSとは別物)
  • CSV/Excel出力: SQL Developer のエクスポート機能が最速

これらのSQLは、ユーザー棚卸し・退職者アカウント削除・セキュリティ監査・権限見直しなど、企業のデータベース運用に必須の業務で活躍します。本記事のSQL集を運用手順書やナレッジベースに登録して、必要時にすぐ呼び出せるようにしておきましょう。


本記事は2026年6月時点の情報をもとに、Oracle Database 19c / 21c / 23ai / 26ai での動作確認・公式ドキュメントに基づき作成しています。バージョンによって一部ビューの列構成が異なる場合があるため、最新の情報はOracle公式ドキュメントもあわせてご確認ください。