【完全版】Oracle Databaseでディレクトリを確認する全方法|ALL_DIRECTORIES
- 作成日 2026.06.10
- 更新日 2026.06.17
- Oracle Database
「Oracleでディレクトリオブジェクトを確認したい」Data Pumpでのエクスポート/インポート、UTL_FILEでのファイル入出力、外部表の定義など、Oracleでサーバー側のファイルを扱うあらゆる場面で必要になる作業です。
しかし、単に SELECT * FROM ALL_DIRECTORIES; を実行するだけでは不十分です。実務では以下のような追加情報が必要になります。
- どのディレクトリにどのユーザーがREAD/WRITE権限を持っているか
- そのディレクトリが指すOSパスが実際に存在するか
- CDB環境で全PDBのディレクトリを横断確認したい
- Data Pumpジョブがエラーになる原因を特定したい
- ORA-29280やORA-29283エラーの原因を調査したい
本記事では、Oracle Databaseでディレクトリオブジェクトを確認するすべての方法を、実務でそのまま使えるSQL集として整理します。基本確認SQLから、権限確認・OS実在チェック・Data Pump連携・関連エラー対処・SQL Developer/A5:SQL Mk-2のGUI操作・FAQまで完全網羅。この1本でディレクトリ運用に関するあらゆる疑問が解決します。
- 1. 結論:とにかく今すぐ知りたい人向けの3パターン
- 2. ディレクトリオブジェクトとは?
- 3. まず押さえるべき:ALL_DIRECTORIES / DBA_DIRECTORIES / CDB_DIRECTORIES の違い
- 4. 基本パターン:ディレクトリ一覧を取得する
- 5. ディレクトリビューの各カラムの意味
- 6. デフォルトで存在するディレクトリ
- 7. 特定のディレクトリを検索する
- 8. 【重要】ディレクトリの権限を確認する
- 9. 【実践】OS上のディレクトリパスが実在するか確認する
- 10. ディレクトリの作成・変更・削除
- 11. Data Pumpでのディレクトリ利用と確認
- 12. UTL_FILEでのディレクトリ利用と確認
- 13. 外部表(External Table)でのディレクトリ利用
- 14. CDB/PDB環境での挙動
- 15. ディレクトリ関連エラーと対処法
- 16. GUIツールでディレクトリを確認する
- 17. CSVにディレクトリ一覧をエクスポートする
- 18. プログラム言語からディレクトリ一覧を取得する
- 19. セキュリティ・運用のベストプラクティス
- 20. 用途別:使い分けクイックリファレンス
- 21. よくある質問(FAQ)
- 21.1. Q1. USER_DIRECTORIESというビューはありますか?
- 21.2. Q2. ディレクトリオブジェクトは誰でも作成できますか?
- 21.3. Q3. ディレクトリのパスはどこからでも参照できますか?
- 21.4. Q4. パスが存在しなくてもディレクトリオブジェクトを作成できるのはなぜ?
- 21.5. Q5. ALL_DIRECTORIESに表示されるのに、UTL_FILEで使うとORA-29280が出ます
- 21.6. Q6. ディレクトリオブジェクトの名前を変更したいです
- 21.7. Q7. CDB環境でPDB内に作成したディレクトリを別PDBから参照できますか?
- 21.8. Q8. ディレクトリの使用履歴を確認できますか?
- 21.9. Q9. SYS以外のユーザーがディレクトリを所有することはできますか?
- 21.10. Q10. WindowsとLinuxでパスの書き方は違いますか?
- 22. まとめ
結論:とにかく今すぐ知りたい人向けの3パターン
まずは、時間がない方向けに、最頻出の3パターンを先に示します。
①ディレクトリ一覧を見たい
SELECT * FROM ALL_DIRECTORIES;
②特定のディレクトリのパスを確認したい
SELECT DIRECTORY_NAME, DIRECTORY_PATH
FROM ALL_DIRECTORIES
WHERE DIRECTORY_NAME = 'DATA_PUMP_DIR';
③ディレクトリへのアクセス権限を確認したい
SELECT GRANTEE, PRIVILEGE
FROM DBA_TAB_PRIVS
WHERE TABLE_NAME = 'DATA_PUMP_DIR';
詳細は以下で順に解説します。
ディレクトリオブジェクトとは?
Oracleの「ディレクトリオブジェクト」は、サーバーOS上のファイルパスをデータベース内で別名管理する仕組みです。OSパスをハードコードする代わりに、ディレクトリ名を介してファイルへアクセスできます。
主な用途
| 機能 | 用途 |
|---|---|
| Data Pump(expdp/impdp) | ダンプファイルの読み書き |
| UTL_FILE | PL/SQLからのファイル入出力 |
| 外部表(External Table) | CSV等の外部ファイルをSQLで参照 |
| BFILE | 大容量バイナリファイルの参照 |
| DBMS_LOB | LOBオブジェクトのファイル操作 |
| PreSelf-update | Oracle自動更新機能のスクリプト保管 |
特徴
- すべてのディレクトリはSYSスキーマに作成され、単一の名前空間で管理される(ユーザーごとではない)
- 通常は SYSアカウント または CREATE ANY DIRECTORY権限を持つユーザー が作成
- アクセス制御はREAD/WRITE/EXECUTE権限の付与で行う
- OSパスが実在するかはOracleはチェックしない(実在しないパスでもオブジェクト作成できる)
まず押さえるべき:ALL_DIRECTORIES / DBA_DIRECTORIES / CDB_DIRECTORIES の違い
Oracleにはディレクトリ情報を確認するためのデータディクショナリビューが3種類あります。
| ビュー名 | 取得範囲 | 必要権限 |
|---|---|---|
ALL_DIRECTORIES | 自分がアクセス可能なディレクトリ | 不要 |
DBA_DIRECTORIES | データベース内の全ディレクトリ | DBA権限または SELECT_CATALOG_ROLE |
CDB_DIRECTORIES | CDB全体(全PDB)の全ディレクトリ | DBA権限+CDBルート接続 |
⚠️ USER_DIRECTORIESは存在しません。ディレクトリは全てSYSが所有するため、ユーザー個別ビューは用意されていません。
使い分けの指針
- 一般ユーザーが現在使えるディレクトリを確認 →
ALL_DIRECTORIES - DBA・運用が全体管理 →
DBA_DIRECTORIES - マルチテナント全体管理 →
CDB_DIRECTORIES
基本パターン:ディレクトリ一覧を取得する
アクセス可能なディレクトリ一覧
SELECT OWNER, DIRECTORY_NAME, DIRECTORY_PATH
FROM ALL_DIRECTORIES
ORDER BY DIRECTORY_NAME;
全ディレクトリ一覧(DBA権限必要)
SELECT OWNER, DIRECTORY_NAME, DIRECTORY_PATH, ORIGIN_CON_ID
FROM DBA_DIRECTORIES
ORDER BY DIRECTORY_NAME;
CDB全体のディレクトリ一覧
SELECT CON_ID, OWNER, DIRECTORY_NAME, DIRECTORY_PATH
FROM CDB_DIRECTORIES
ORDER BY CON_ID, DIRECTORY_NAME;
ディレクトリビューの各カラムの意味
ALL_DIRECTORIES / DBA_DIRECTORIES には以下のカラムが含まれます。
| カラム名 | 意味 |
|---|---|
OWNER | 所有者。常に SYS(ディレクトリは全てSYS所有) |
DIRECTORY_NAME | ディレクトリオブジェクト名(例: DATA_PUMP_DIR) |
DIRECTORY_PATH | 実際のOSパス(例: /u01/app/oracle/admin/orcl/dpdump/) |
ORIGIN_CON_ID | 作成元のコンテナID(CDB環境のみ) |
OracleではOSパスの実在チェックは行われないため、DIRECTORY_PATH のパスが本当に存在するかは別途確認が必要です(後述)。
デフォルトで存在するディレクトリ
Oracleをインストールすると、いくつかのディレクトリがデフォルトで作成されています。代表例:
| ディレクトリ名 | 用途 |
|---|---|
DATA_PUMP_DIR | Data Pump(expdp/impdp)のデフォルトディレクトリ |
ORACLE_OCM_CONFIG_DIR | Oracle Configuration Managerの設定ディレクトリ |
OPATCH_INST_DIR | パッチ適用関連 |
OPATCH_LOG_DIR | パッチ適用ログ |
OPATCH_SCRIPT_DIR | パッチ適用スクリプト |
XSDDIR | XMLスキーマ関連 |
これらは通常の運用で意識する必要はありませんが、Data Pumpを使う場合は DATA_PUMP_DIR が頻出します。
特定のディレクトリを検索する
完全一致
SELECT *
FROM ALL_DIRECTORIES
WHERE DIRECTORY_NAME = 'DATA_PUMP_DIR';
⚠️ 大文字小文字注意: Oracleではディレクトリ名は内部的に大文字管理です。data_pump_dir ではなく DATA_PUMP_DIR で検索してください。
部分一致
SELECT DIRECTORY_NAME, DIRECTORY_PATH
FROM ALL_DIRECTORIES
WHERE DIRECTORY_NAME LIKE 'DATA_%'
ORDER BY DIRECTORY_NAME;
⚠️ _(アンダースコア)はワイルドカードのため、リテラルとして扱いたい場合はエスケープ:
SELECT DIRECTORY_NAME
FROM ALL_DIRECTORIES
WHERE DIRECTORY_NAME LIKE 'DATA\_%' ESCAPE '\';
パスで検索
SELECT DIRECTORY_NAME, DIRECTORY_PATH
FROM DBA_DIRECTORIES
WHERE UPPER(DIRECTORY_PATH) LIKE '%DPDUMP%'
ORDER BY DIRECTORY_NAME;
同じパスを指すディレクトリを抽出
SELECT DIRECTORY_PATH, COUNT(*) AS DIR_COUNT, LISTAGG(DIRECTORY_NAME, ', ') WITHIN GROUP (ORDER BY DIRECTORY_NAME) AS DIRECTORIES
FROM DBA_DIRECTORIES
GROUP BY DIRECTORY_PATH
HAVING COUNT(*) > 1;
同じOSパスに対して複数のディレクトリオブジェクトが作成されていないか確認できます。
【重要】ディレクトリの権限を確認する
ディレクトリへのアクセス権限は、ユーザーが何を実行できるかを決定する重要な要素です。
ディレクトリ権限の種類
| 権限 | 内容 |
|---|---|
READ | ディレクトリ内のファイル読み込み |
WRITE | ディレクトリへのファイル書き込み |
EXECUTE | ディレクトリ内の実行可能ファイル実行(限定的用途) |
全ディレクトリ権限の一覧
SELECT
GRANTEE,
TABLE_NAME AS DIRECTORY_NAME,
PRIVILEGE,
GRANTABLE
FROM DBA_TAB_PRIVS
WHERE TYPE = 'DIRECTORY'
ORDER BY TABLE_NAME, GRANTEE, PRIVILEGE;
特定ディレクトリの権限保有者
SELECT GRANTEE, PRIVILEGE, GRANTABLE
FROM DBA_TAB_PRIVS
WHERE TYPE = 'DIRECTORY'
AND TABLE_NAME = 'DATA_PUMP_DIR'
ORDER BY GRANTEE, PRIVILEGE;
特定ユーザーが持つディレクトリ権限
SELECT
TABLE_NAME AS DIRECTORY_NAME,
PRIVILEGE,
GRANTOR
FROM USER_TAB_PRIVS
WHERE TYPE = 'DIRECTORY'
ORDER BY TABLE_NAME;
DBA権限なしで自分の権限のみ確認したい場合に使えます。
ディレクトリ+権限のサマリー表示
SELECT
d.DIRECTORY_NAME,
d.DIRECTORY_PATH,
LISTAGG(p.GRANTEE || '(' || p.PRIVILEGE || ')', ', ')
WITHIN GROUP (ORDER BY p.GRANTEE) AS GRANTS
FROM DBA_DIRECTORIES d
LEFT JOIN DBA_TAB_PRIVS p
ON p.TABLE_NAME = d.DIRECTORY_NAME
AND p.TYPE = 'DIRECTORY'
GROUP BY d.DIRECTORY_NAME, d.DIRECTORY_PATH
ORDER BY d.DIRECTORY_NAME;
ディレクトリと、その権限を持つユーザーを1行にまとめて確認できる実用的なクエリです。
【実践】OS上のディレクトリパスが実在するか確認する
Oracleはディレクトリオブジェクト作成時にOSパスの実在チェックを行いません。実在しないパスに対してもオブジェクトが作成可能なため、運用時はOS側の確認が必須です。
Linux/UNIX上での確認
# 一覧出力したOSパスをチェック
sqlplus -s system/password@orcl <<EOF
SET HEADING OFF FEEDBACK OFF PAGESIZE 0
SELECT DIRECTORY_PATH FROM DBA_DIRECTORIES;
EXIT
EOF | while read path; do
if [ -d "$path" ]; then
echo "OK : $path"
else
echo "NG : $path (存在しません)"
fi
done
Windows上での確認
sqlplus -s system/password@orcl ^
-c "SELECT DIRECTORY_PATH FROM DBA_DIRECTORIES;" > paths.txt
for /F %i in (paths.txt) do if exist "%i" (echo OK: %i) else (echo NG: %i)
PL/SQL(UTL_FILE)で実在チェック
DECLARE
v_file_handle UTL_FILE.FILE_TYPE;
v_dir_name VARCHAR2(30) := 'DATA_PUMP_DIR';
v_test_file VARCHAR2(100) := 'test_' || TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS') || '.tmp';
BEGIN
v_file_handle := UTL_FILE.FOPEN(v_dir_name, v_test_file, 'W');
UTL_FILE.PUT_LINE(v_file_handle, 'test');
UTL_FILE.FCLOSE(v_file_handle);
UTL_FILE.FREMOVE(v_dir_name, v_test_file);
DBMS_OUTPUT.PUT_LINE('OK: 書き込み・削除可能');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('NG: ' || SQLERRM);
END;
/
実際にファイル書き込みテストを行い、ディレクトリが使用可能か検証する方法です。
ディレクトリの作成・変更・削除
作成
CREATE DIRECTORY my_data_dir AS '/u01/app/oracle/data';
変更(パスの変更は CREATE OR REPLACE)
CREATE OR REPLACE DIRECTORY my_data_dir AS '/u02/app/oracle/data';
削除
DROP DIRECTORY my_data_dir;
権限の付与
GRANT READ, WRITE ON DIRECTORY my_data_dir TO hr;
権限の取り消し
REVOKE READ, WRITE ON DIRECTORY my_data_dir FROM hr;
名前変更について
⚠️ Oracleでは ディレクトリオブジェクトの名前を直接変更することはできません。DROP してから別名で CREATE する必要があります。
Data Pumpでのディレクトリ利用と確認
Data Pump(expdp/impdp)はディレクトリオブジェクトの最大の利用シーンです。
Data Pump用ディレクトリの作成例
-- ディレクトリを作成
CREATE DIRECTORY dp_dir AS '/u01/dump';
-- Data Pump実行ユーザーに権限付与
GRANT READ, WRITE ON DIRECTORY dp_dir TO scott;
-- Data Pumpジョブ用のシステム権限
GRANT EXP_FULL_DATABASE, IMP_FULL_DATABASE TO scott;
expdpコマンド例
expdp scott/tiger@orcl \
DIRECTORY=dp_dir \
DUMPFILE=scott_backup.dmp \
LOGFILE=scott_backup.log \
SCHEMAS=scott
Data Pumpジョブ実行履歴の確認
SELECT
OWNER_NAME,
JOB_NAME,
OPERATION,
JOB_MODE,
STATE
FROM DBA_DATAPUMP_JOBS
ORDER BY JOB_NAME;
Data Pump失敗時のディレクトリ確認チェックリスト
- ディレクトリオブジェクトが存在するか:
SELECT * FROM DBA_DIRECTORIES WHERE DIRECTORY_NAME = 'DP_DIR'; - 実行ユーザーにREAD/WRITE権限があるか:
SELECT * FROM DBA_TAB_PRIVS WHERE TABLE_NAME = 'DP_DIR'; - OSパスが実在するか:
ls -ld /u01/dump - Oracleプロセス所有者(通常
oracle)がそのパスに対する読み書き権限を持つか:ls -ld /u01/dump
UTL_FILEでのディレクトリ利用と確認
PL/SQLからファイルを操作する UTL_FILE パッケージでもディレクトリオブジェクトが使われます。
利用方法
DECLARE
v_file UTL_FILE.FILE_TYPE;
BEGIN
v_file := UTL_FILE.FOPEN('MY_DATA_DIR', 'output.txt', 'W');
UTL_FILE.PUT_LINE(v_file, 'Hello, World!');
UTL_FILE.FCLOSE(v_file);
END;
/
よくあるエラー
| エラー | 原因 |
|---|---|
ORA-29280: ディレクトリ・パスが無効です | ディレクトリオブジェクトが存在しないか、名前間違い |
ORA-29283: ファイル操作が無効です | OS側のパーミッション不足 |
ORA-29289: ディレクトリ・アクセスが拒否されました | READ/WRITE権限が付与されていない |
外部表(External Table)でのディレクトリ利用
CSVファイルなどをSQLで直接参照する外部表もディレクトリオブジェクトを使います。
外部表の作成例
CREATE TABLE emp_external (
emp_id NUMBER,
emp_name VARCHAR2(100)
)
ORGANIZATION EXTERNAL (
TYPE ORACLE_LOADER
DEFAULT DIRECTORY my_data_dir
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
FIELDS TERMINATED BY ','
)
LOCATION ('employees.csv')
);
外部表が参照するディレクトリの確認
SELECT
TABLE_NAME,
DEFAULT_DIRECTORY_OWNER,
DEFAULT_DIRECTORY_NAME,
TYPE_NAME
FROM DBA_EXTERNAL_TABLES
ORDER BY TABLE_NAME;
CDB/PDB環境での挙動
マルチテナント環境では、ディレクトリはコンテナ単位で管理されます。
現在の接続コンテナを確認
SHOW CON_NAME
-- または
SELECT SYS_CONTEXT('USERENV', 'CON_NAME') FROM DUAL;
コンテナ別のディレクトリ一覧
SELECT
p.NAME AS CONTAINER_NAME,
d.DIRECTORY_NAME,
d.DIRECTORY_PATH
FROM CDB_DIRECTORIES d
JOIN V$CONTAINERS p ON d.CON_ID = p.CON_ID
ORDER BY p.NAME, d.DIRECTORY_NAME;
コモン(CDBルートで作成)vs ローカル(PDB内で作成)
-- ルートで作成されたディレクトリ
SELECT * FROM CDB_DIRECTORIES WHERE ORIGIN_CON_ID = 1;
-- 各PDB内で作成されたディレクトリ
SELECT * FROM CDB_DIRECTORIES WHERE ORIGIN_CON_ID > 2;
ディレクトリ関連エラーと対処法
実務でよく遭遇するエラーと、ディレクトリ視点での原因切り分け方法です。
ORA-29280: ディレクトリ・パスが無効です
原因:
- ディレクトリオブジェクトが存在しない
- ディレクトリ名のスペルミス
- ディレクトリ名を小文字で指定(内部的に大文字管理)
確認:
SELECT DIRECTORY_NAME FROM ALL_DIRECTORIES;
ORA-29283: ファイル操作が無効です
原因:
- OSパスが実在しない
- OracleプロセスのOSユーザーに該当パスへのアクセス権限がない
- ディスク容量不足
確認:
# OS側でディレクトリ実在とパーミッション確認
ls -ld /u01/dump
# Oracleプロセスのユーザーを確認
ps -ef | grep ora_pmon
ORA-29289: ディレクトリ・アクセスが拒否されました
原因: ユーザーにREAD/WRITE権限が付与されていない
確認:
SELECT * FROM USER_TAB_PRIVS WHERE TABLE_NAME = 'DATA_PUMP_DIR';
対処:
GRANT READ, WRITE ON DIRECTORY data_pump_dir TO your_user;
ORA-22288: ファイルまたはLOB操作が失敗しました
原因: BFILEで指すファイルが存在しない、または読み取り権限なし
確認: ディレクトリパスとファイル存在をOS側で確認
GUIツールでディレクトリを確認する
SQL Developer
- データベースに接続
- ツリーから「他のユーザー」→「SYS」を展開
- 「ディレクトリ」を展開
- ディレクトリ一覧が表示され、クリックで詳細(パス・権限)が確認可能
DBA接続を作成すると、より詳細な管理ビュー(権限付与の操作含む)が使えます。
A5:SQL Mk-2
- 接続先データベースを開く
- ツリーから「ディレクトリ」(バージョンによっては「DIRECTORY」)を展開
- 一覧が表示される
Oracle Enterprise Manager(OEM)
- 「スキーマ」→「データベース・オブジェクト」→「ディレクトリ・オブジェクト」
- 一覧から各ディレクトリのプロパティを確認・編集できる
CSVにディレクトリ一覧をエクスポートする
SQL*Plus
SET MARKUP CSV ON
SET FEEDBACK OFF
SET HEADING ON
SPOOL directories.csv
SELECT OWNER, DIRECTORY_NAME, DIRECTORY_PATH
FROM DBA_DIRECTORIES
ORDER BY DIRECTORY_NAME;
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 DIRECTORY_NAME, DIRECTORY_PATH
FROM ALL_DIRECTORIES
ORDER BY DIRECTORY_NAME
""")
for name, path in cursor:
print(f"{name:30} -> {path}")
cursor.close()
conn.close()
Java(JDBC)
String sql = "SELECT DIRECTORY_NAME, DIRECTORY_PATH FROM ALL_DIRECTORIES";
try (PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
System.out.printf("%-30s -> %s%n",
rs.getString("DIRECTORY_NAME"),
rs.getString("DIRECTORY_PATH"));
}
}
Node.js(node-oracledb)
const oracledb = require('oracledb');
async function listDirectories() {
const conn = await oracledb.getConnection({
user: "system",
password: "password",
connectString: "localhost:1521/XEPDB1"
});
const result = await conn.execute(`
SELECT DIRECTORY_NAME, DIRECTORY_PATH
FROM ALL_DIRECTORIES
ORDER BY DIRECTORY_NAME
`);
result.rows.forEach(row => console.log(row));
await conn.close();
}
listDirectories();
セキュリティ・運用のベストプラクティス
ディレクトリオブジェクトはOSファイルシステムへのアクセスを介するため、セキュリティ上の重要要素です。
1. 最小権限の原則
不必要に READ / WRITE 権限を付与しない。Data Pump実行ユーザー以外には基本的に付与不要です。
2. 共有ディレクトリの分離
開発・テスト・本番で別のディレクトリオブジェクトを使う。同じOSパスを共有しない。
3. PUBLIC への権限付与は避ける
-- これは危険
GRANT READ, WRITE ON DIRECTORY data_pump_dir TO PUBLIC;
PUBLICへの権限付与は全ユーザーにアクセス権を与えることになり、セキュリティ事故の原因となります。
4. 不要ディレクトリの削除
未使用のディレクトリオブジェクトは定期的に棚卸しして削除する。
-- 使われていない可能性が高いディレクトリ(権限保有者なし)
SELECT d.DIRECTORY_NAME, d.DIRECTORY_PATH
FROM DBA_DIRECTORIES d
WHERE NOT EXISTS (
SELECT 1 FROM DBA_TAB_PRIVS p
WHERE p.TABLE_NAME = d.DIRECTORY_NAME
AND p.TYPE = 'DIRECTORY'
)
ORDER BY DIRECTORY_NAME;
5. パスは絶対パスで指定
相対パスは予期しない挙動を引き起こすため、必ず絶対パスで定義する。
6. ディレクトリの暗号化・監査
機密データを扱うディレクトリは、OS側で暗号化&Oracle監査(Unified Auditing)でアクセスログ取得を有効にする。
用途別:使い分けクイックリファレンス
| やりたいこと | 推奨方法 |
|---|---|
| 自分が使えるディレクトリ一覧 | SELECT * FROM ALL_DIRECTORIES |
| 全ディレクトリ(管理用) | SELECT * FROM DBA_DIRECTORIES |
| マルチテナント全体 | SELECT * FROM CDB_DIRECTORIES |
| 権限保有者の確認 | DBA_TAB_PRIVS WHERE TYPE = 'DIRECTORY' |
| 自分の権限のみ確認 | USER_TAB_PRIVS WHERE TYPE = 'DIRECTORY' |
| OSパス実在チェック | OSコマンド or UTL_FILE試行 |
| ディレクトリ作成 | CREATE DIRECTORY |
| ディレクトリ削除 | DROP DIRECTORY |
| パス変更 | CREATE OR REPLACE DIRECTORY |
| 名前変更 | DROP→再CREATE(直接は不可) |
よくある質問(FAQ)
Q1. USER_DIRECTORIESというビューはありますか?
存在しません。ディレクトリオブジェクトは常にSYSが所有するため、ユーザー個別のビューは用意されていません。自分がアクセス可能なディレクトリは ALL_DIRECTORIES で、自分の権限は USER_TAB_PRIVS WHERE TYPE = 'DIRECTORY' で確認します。
Q2. ディレクトリオブジェクトは誰でも作成できますか?
いいえ。CREATE ANY DIRECTORY システム権限を持つユーザーのみ作成可能です。デフォルトではDBA権限を持つユーザーのみがこの権限を持ちます。
Q3. ディレクトリのパスはどこからでも参照できますか?
OracleプロセスのOSユーザー(通常 oracle)から読み書きできるパスである必要があります。Linuxの場合は ls -ld で確認、Windowsの場合はNTFSのアクセス権限を確認してください。
Q4. パスが存在しなくてもディレクトリオブジェクトを作成できるのはなぜ?
Oracleはオブジェクトレベルの抽象化のみを行い、OSパスの実在チェックは意図的に行わない設計です。これにより、後からOS側のパスを準備する運用や、リモートマウント前のオブジェクト先行作成が可能になっています。ただし、実際の読み書きを実行する瞬間にエラーになるため、運用時はOS側の整合性確認が必要です。
Q5. ALL_DIRECTORIESに表示されるのに、UTL_FILEで使うとORA-29280が出ます
考えられる原因:
- ディレクトリ名を小文字で指定している → 大文字で再指定
- READ/WRITE権限が付与されていない →
USER_TAB_PRIVSで確認 - OSパスが実在しない → サーバー側で
ls確認 - Oracleプロセスにアクセス権限がない → OSパーミッション確認
Q6. ディレクトリオブジェクトの名前を変更したいです
直接変更はできません。DROP DIRECTORY 旧名前; → CREATE DIRECTORY 新名前 AS 'パス'; → 必要な権限を再付与、の手順が必要です。既存の外部表やData Pumpジョブ定義がそのディレクトリを参照している場合は、それらも修正が必要です。
Q7. CDB環境でPDB内に作成したディレクトリを別PDBから参照できますか?
できません。PDB内で作成したディレクトリは、そのPDB内でのみ有効です。CDB全体で共有したい場合は、CDBルートに接続してコモンユーザー(C##プレフィックス) で作成する必要があります。
Q8. ディレクトリの使用履歴を確認できますか?
DBA_DIRECTORIES には最終使用日時等の情報はありません。Unified Auditingで監査ポリシーを設定するか、Data PumpジョブやUTL_FILEログから間接的に確認する必要があります。
Q9. SYS以外のユーザーがディレクトリを所有することはできますか?
できません。すべてのディレクトリは仕様としてSYSが所有します。これはディレクトリが単一の名前空間で管理されるためで、ユーザースキーマで所有することができない設計です。
Q10. WindowsとLinuxでパスの書き方は違いますか?
Windowsでは 'C:\temp\data' のようにバックスラッシュ、Linuxでは '/u01/data' のようにスラッシュを使います。OS間で互換性はないため、OS移行時はディレクトリオブジェクトの再作成が必要です。
まとめ
Oracle Databaseのディレクトリオブジェクトは、Data Pump・UTL_FILE・外部表・BFILEなど、OSファイルとデータベースを橋渡しする重要な仕組みです。確認・運用のポイントを再整理します。
- 基本3ビューを使い分け:
ALL_DIRECTORIES(一般)/DBA_DIRECTORIES(管理)/CDB_DIRECTORIES(マルチテナント) - 権限確認は必須:
DBA_TAB_PRIVS WHERE TYPE = 'DIRECTORY'でREAD/WRITE保有者を把握 - OSパスの実在チェック: Oracleはチェックしないため、OS側で別途確認
- Data Pump連携:
DATA_PUMP_DIRの権限と実体ファイルパスは要セット確認 - エラー時の切り分け: ORA-29280/29283/29289 はそれぞれ原因と対処が異なる
- セキュリティ: 最小権限の原則、PUBLICへの付与回避、不要ディレクトリの定期棚卸し
これらのSQLとチェック手順は、Data Pumpトラブル対応・外部ファイル連携機能の構築・セキュリティ監査などで必須の業務です。本記事を社内のナレッジベースに登録し、必要な時にすぐ参照できる状態にしておくと運用効率が大幅に向上します。
本記事は2026年6月時点の情報をもとに、Oracle Database 19c / 21c / 23ai / 26ai での動作確認・公式ドキュメントに基づき作成しています。バージョンによって一部ビューの列構成が異なる場合があるため、最新の情報はOracle公式ドキュメントもあわせてご確認ください。
-
前の記事
UbuntuでDockerログを確認する方法 | リアルタイム監視 2026.06.10
-
次の記事
AIOSEO で投稿のメタディスクリプションが保存できず「投稿の抜粋」に戻ってしまう問題の原因と解決方法 2026.06.10
コメントを書く