【完全版】Oracle Databaseでユーザー一覧を取得する全方法
- 作成日 2026.06.09
- 更新日 2026.06.17
- 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本でユーザー管理の悩みが解消します。
- 1. 結論:とにかく今すぐ知りたい人向けの3パターン
- 2. まず押さえるべき:USER_USERS / ALL_USERS / DBA_USERS / CDB_USERS の違い
- 3. 基本パターン:シンプルなユーザー一覧取得
- 4. 現在のログインユーザーを確認する
- 5. アカウント状態で絞り込む
- 6. 最終ログイン日時を確認する(12c以降)
- 7. Oracle標準ユーザーを除外して自社ユーザーのみ抽出
- 8. 特定ユーザーを検索する
- 9. ユーザー数を集計する
- 10. 【実践】権限・ロール込みでユーザー一覧を取得する
- 11. 認証方式・パスワード情報を確認する
- 12. プロファイルとリソース制限を確認する
- 13. デフォルト表領域・一時表領域を確認する
- 14. CDB/PDB環境でのユーザー一覧
- 15. 現在接続中のセッション一覧(V$SESSION)
- 16. 【セキュリティ監査】チェックリストSQL集
- 17. GUIツールでユーザー一覧を確認する
- 18. CSVファイルにユーザー一覧をエクスポートする
- 19. プログラム言語からユーザー一覧を取得する
- 20. 用途別:使い分けクイックリファレンス
- 21. ユーザーとスキーマの違いを理解する
- 22. よくある質問(FAQ)
- 22.1. Q1. ALL_USERSとDBA_USERSの違いは結局何ですか?
- 22.2. Q2. ORA-00942(表またはビューが存在しません)が出ます
- 22.3. Q3. LAST_LOGINが空欄のユーザーがいます
- 22.4. Q4. ユーザー名を小文字で作成したのに大文字で表示される
- 22.5. Q5. CDB_USERSとDBA_USERSの違いは?
- 22.6. Q6. C##で始まるユーザーは何ですか?
- 22.7. Q7. SYSとSYSTEMの違いは?
- 22.8. Q8. ユーザー一覧をExcelで管理したいです
- 22.9. Q9. 削除されたユーザーの履歴を確認できますか?
- 22.10. Q10. ユーザー一覧の取得が遅いのはなぜ?
- 23. まとめ
結論:とにかく今すぐ知りたい人向けの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_USERS に LAST_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
- 接続を作成して接続
- ツリーから「他のユーザー」を展開
- 全ユーザー一覧が表示される
- 各ユーザーをクリックすると詳細情報(権限・ロール・オブジェクト所有)も確認可能
「表示」→「DBA」→ DBA接続を追加すると、より詳細な管理ビューが使えます。
A5:SQL Mk-2
- データベースに接続
- ツリーの「ユーザー(スキーマ)」を展開
- 一覧が表示される
「ツール」→「システム管理」→「ユーザー一覧」でも詳細情報を確認できます。
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
- クエリを実行
- 結果セットを右クリック→「エクスポート」
- 形式に「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 は権限不要で全ユーザーを参照できますが、取得できるのは USERNAME、USER_ID、CREATED などの 基本情報のみ です。DBA_USERS はDBA権限が必要ですが、ACCOUNT_STATUS、LAST_LOGIN、DEFAULT_TABLESPACE、PROFILE など 管理に必要な詳細情報 をすべて取得できます。
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_DEFPWD、LAST_LOGIN、DBA_ROLE_PRIVSを組み合わせて定期チェック - マルチテナント:
CDB_USERSで全PDBを横断確認 - 接続中ユーザー:
V$SESSIONを使う(DBA_USERSとは別物) - CSV/Excel出力: SQL Developer のエクスポート機能が最速
これらのSQLは、ユーザー棚卸し・退職者アカウント削除・セキュリティ監査・権限見直しなど、企業のデータベース運用に必須の業務で活躍します。本記事のSQL集を運用手順書やナレッジベースに登録して、必要時にすぐ呼び出せるようにしておきましょう。
本記事は2026年6月時点の情報をもとに、Oracle Database 19c / 21c / 23ai / 26ai での動作確認・公式ドキュメントに基づき作成しています。バージョンによって一部ビューの列構成が異なる場合があるため、最新の情報はOracle公式ドキュメントもあわせてご確認ください。
-
前の記事
Ubuntuでログファイルを効率よく確認する方法 | 効率よく確認する方法 2026.06.09
-
次の記事
UbuntuでDockerログを確認する方法 | リアルタイム監視 2026.06.10
コメントを書く