【完全版】Oracle Databaseでディレクトリを確認する全方法|ALL_DIRECTORIES

【完全版】Oracle Databaseでディレクトリを確認する全方法|ALL_DIRECTORIES

「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本でディレクトリ運用に関するあらゆる疑問が解決します。


目次

結論:とにかく今すぐ知りたい人向けの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_FILEPL/SQLからのファイル入出力
外部表(External Table)CSV等の外部ファイルをSQLで参照
BFILE大容量バイナリファイルの参照
DBMS_LOBLOBオブジェクトのファイル操作
PreSelf-updateOracle自動更新機能のスクリプト保管

特徴

  • すべてのディレクトリは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_DIRECTORIESCDB全体(全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_DIRData Pump(expdp/impdp)のデフォルトディレクトリ
ORACLE_OCM_CONFIG_DIROracle Configuration Managerの設定ディレクトリ
OPATCH_INST_DIRパッチ適用関連
OPATCH_LOG_DIRパッチ適用ログ
OPATCH_SCRIPT_DIRパッチ適用スクリプト
XSDDIRXMLスキーマ関連

これらは通常の運用で意識する必要はありませんが、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失敗時のディレクトリ確認チェックリスト

  1. ディレクトリオブジェクトが存在するか: SELECT * FROM DBA_DIRECTORIES WHERE DIRECTORY_NAME = 'DP_DIR';
  2. 実行ユーザーにREAD/WRITE権限があるか: SELECT * FROM DBA_TAB_PRIVS WHERE TABLE_NAME = 'DP_DIR';
  3. OSパスが実在するか: ls -ld /u01/dump
  4. 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

  1. データベースに接続
  2. ツリーから「他のユーザー」→「SYS」を展開
  3. ディレクトリ」を展開
  4. ディレクトリ一覧が表示され、クリックで詳細(パス・権限)が確認可能

DBA接続を作成すると、より詳細な管理ビュー(権限付与の操作含む)が使えます。

A5:SQL Mk-2

  1. 接続先データベースを開く
  2. ツリーから「ディレクトリ」(バージョンによっては「DIRECTORY」)を展開
  3. 一覧が表示される

Oracle Enterprise Manager(OEM)

  1. スキーマ」→「データベース・オブジェクト」→「ディレクトリ・オブジェクト
  2. 一覧から各ディレクトリのプロパティを確認・編集できる

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

  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 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公式ドキュメントもあわせてご確認ください。