CREATE DIRECTORY
目的
CREATE
DIRECTORY
文を使用すると、ディレクトリ・オブジェクトを作成できます。ディレクトリ・オブジェクトは、外部バイナリ・ファイルLOB(BFILE
)および外部表データが存在するサーバー・ファイル・システム上のディレクトリの別名を示します。PL/SQLコードおよびOCIコールでBFILE
を参照する際、管理の汎用性のために、オペレーティング・システムのパス名をハード・エンコードせずにディレクトリ名を使用できます。
すべてのディレクトリは1つのネームスペースに作成され、個別のスキーマでは所有されません。ディレクトリに対するオブジェクト権限を特定ユーザーに付与することによって、そのディレクトリ構造内に格納されているBFILE
へのアクセスを制限できます。
関連項目:
-
BFILE
オブジェクトの詳細は、「ラージ・オブジェクト(LOB)・データ型」を参照してください。 -
オブジェクト権限の付与の詳細は、「GRANT」を参照してください。
-
「
CREATE
TABLE
」の「external_table_clause::=」を参照してください。
前提条件
ディレクトリを作成するには、CREATE
ANY
DIRECTORY
システム権限が必要です。
ディレクトリを作成すると、そのディレクトリに対するREAD
、WRITE
およびEXECUTE
オブジェクト権限が自動的に付与され、他のユーザーおよびロールにこれらの権限を付与できます。DBAも、これらの権限を他のユーザーおよびロールに付与できます。
ディレクトリに対するWRITE
権限は、外部表との接続において便利です。これによって、権限受領者は、外部表のエージェントがディレクトリに書き込めるのがログ・ファイルなのか不良ファイルなのかを判断できます。
ファイルの記憶域用に、それに応じたオペレーティング・システムのディレクトリ、Oracle Automatic Storage Management (Oracle ASM)ディスク・グループ、またはOracle ASMディスク・グループ内のディレクトリを作成する必要もあります。システム管理者およびデータベース管理者は、このオペレーティング・システムのディレクトリに、Oracle Databaseプロセスに対する読取り権限および書込み権限が正しく設定されていることを確認する必要があります。
ディレクトリに対して付与される権限は、オペレーティング・システムのディレクトリ用に定義されたアクセス権限とは無関係に作成されるため、これらの権限は完全に対応しない場合があります。たとえば、サンプル・ユーザーhr
に、ディレクトリ・オブジェクトに対するREAD
権限が付与されていても、それに対応するオペレーティング・システムのディレクトリにOracle Databaseプロセスに対するREAD
権限が付与されていない場合は、エラーが発生します。
制限事項
BFILE
オブジェクトを開く際に、ディレクトリ・オブジェクト・パスまたはファイル名ではシンボリック・リンクは使用できません。ディレクトリ・パス全体および ファイル名がチェックされ、シンボリック・リンクが見つかると、次のエラーが返されます。
ORA-22288: file or LOB operation FILEOPEN failed soft link in path
回避策
開こうとしているデータベース・ディレクトリ・オブジェクトまたはファイル名にシンボリック・リンクが含まれている場合、実際のパスおよびファイル名を指定するように変更します。
構文
create_directory::=
セマンティクス
OR REPLACE
OR
REPLACE
を指定すると、既存のディレクトリ・データベース・オブジェクトを再作成できます。この句を指定した場合、既存のディレクトリに付与されているデータベース・オブジェクト権限を削除、再作成および再付与しなくても、そのディレクトリの定義を変更できます。
再定義したディレクトリに対する権限が付与されていたユーザーは、権限が再付与されなくてもそのディレクトリにアクセスできます。
関連項目:
データベースからのディレクトリの削除については、「DROP DIRECTORY」を参照してください。
IF NOT EXISTS
IF NOT EXISTS
を指定すると、次の効果が得られます。
-
ディレクトリが存在していない場合は、文の最後に新しいディレクトリが作成されます。
-
ディレクトリが存在している場合、これは文の最後の時点にあるディレクトリになります。古いものが検出されるため、新しいものは作成されません。
単一の文には、一度に1つのOR REPLACE
またはIF NOT EXISTS
を指定できます。同じ文でOR REPLACE
とIF NOT EXISTS
の両方を使用すると、ORA-11541: REPLACE and IF NOT EXISTS cannot coexist in the same DDL statement
というエラーが発生します。
IF EXISTS
はCREATE
とともに使用すると、ORA-11543: Incorrect IF NOT EXISTS clause for CREATE statement
が発生します。
SHARING
この句は、アプリケーション・ルートにディレクトリを作成する場合にのみ適用されます。このタイプのディレクトリはアプリケーション共通オブジェクトと呼ばれ、アプリケーション・ルートに属するアプリケーションPDBと共有できます。ディレクトリの共有方法を決定するには、次の共有属性のいずれかを指定します。
-
METADATA
- メタデータ・リンクはディレクトリのメタデータを共有しますが、データは各コンテナに固有です。このタイプのディレクトリは、メタデータリンク・アプリケーション共通オブジェクトと呼ばれます。 -
NONE
- ディレクトリは共有されません。
この句を指定しない場合、DEFAULT_SHARING
初期化パラメータの値を使用して、ディレクトリの共有属性が決定されます。DEFAULT_SHARING
初期化パラメータに値が含まれていない場合、デフォルトはMETADATA
です。
ディレクトリの共有属性を作成後に変更することはできません。
関連項目:
-
DEFAULT_SHARING
初期化パラメータの詳細は、Oracle Databaseリファレンスを参照してください -
アプリケーション共通オブジェクトの作成の詳細は、『Oracle Database管理者ガイド』を参照してください。
directory
作成するディレクトリ・オブジェクトの名前を指定します。名前は、「データベース・オブジェクトのネーミング規則」に指定されている要件を満たしている必要があります。
Oracle Databaseでは、指定するディレクトリが実際に存在するかどうかが検証されません。このため、オペレーティング・システムに存在するディレクトリを指定してください。また、オペレーティング・システムでパス名の大/小文字が区別される場合は、正しい形式でディレクトリ名を指定する必要があります。パス名の最後にスラッシュを付ける必要はありません。
ディレクトリ名で親ディレクトリを参照しないでください。たとえば、次の構文は有効です。
CREATE DIRECTORY mydir AS '/scratch/data/file_data';
ただし、次の構文は無効です。
CREATE DIRECTORY mydir AS '/scratch/../file_data';
path_name
ファイルがあるサーバーのオペレーティング・システム・ディレクトリのフル・パス名を指定します。一重引用符が必要です。その結果、パス名の大/小文字が区別されます。
例
ディレクトリの作成: 例
次の文は、サーバー上のディレクトリを指定するディレクトリ・データベース・オブジェクトを作成します。
CREATE DIRECTORY admin AS '/disk1/oracle/admin';
次の文は、オペレーティング・システムのディレクトリusr/bin/bfile_dir
に格納されているBFILE
にアクセスできるように、ディレクトリのデータベース・オブジェクトbfile_dir
を再定義します。
CREATE OR REPLACE DIRECTORY bfile_dir AS '/usr/bin/bfile_dir';