5.1 DIRECTORYオブジェクト

BFILEロケータは、BFILENAME(DIRECTORY, FILENAME)関数を使用して初期化されます。この項では、DIRECTORYオブジェクトの初期化方法について説明します。

ディレクトリ・オブジェクトには、アクセスするファイルがあるデータベース・サーバー・ファイル・システム上の物理ディレクトリの論理的な別名を指定します。サーバー・ファイル・システム内のファイルにアクセスできるのは、DIRECTORYオブジェクトに対する必要なアクセス権限を持っている場合のみです。Oracle Enterprise Manager Cloud Controlを使用してDIRECTORYオブジェクトを管理することもできます。

ディレクトリ・オブジェクトを使用すると、ファイルの位置を柔軟に扱えるようになり、アプリケーション内の物理ファイルの絶対パス名をハードコードしなくてもすみます。

DIRECTORYオブジェクト名は、BFILEロケータの初期化の際に、BFILENAME関数(SQLおよびPL/SQL)またはOCILobFileSetName()関数(OCI)と組み合せて使用されます。

関連項目:

5.1.1 ディレクトリ名の指定

ディレクトリを作成するには、CREATE ANY DIRECTORYシステム権限が必要です。

ディレクトリ・オブジェクトのネーミング規則は、表および索引のネーミング規則と同じです。つまり、通常の識別子は大文字で解釈されますが、デリミタ付き識別子はそのまま解釈されます。たとえば、次のような文があるとします。

CREATE OR REPLACE DIRECTORY scott_dir AS '/usr/home/scott';

この文は、「SCOTT_DIR」という名前(大文字)のディレクトリ・オブジェクトを作成または再定義します。ただし、次の文のように、ディレクトリ名にデリミタ付き識別子が使用されるとします。

CREATE DIRECTORY "Mary_Dir" AS '/usr/home/mary';

DIRECTORYディレクトリ・オブジェクトの名前は'Mary_Dir'になります。BFILENAMEをコールするときは、「SCOTT_DIR」および「Mary_Dir」を使用します。たとえば:

BFILENAME('SCOTT_DIR', 'afile')
BFILENAME('Mary_Dir', 'afile')

警告:

データベースは、指定したディレクトリおよびパス名が実際に存在するかどうかは検証しません。ご使用のオペレーティング・システムで有効なディレクトリ名を指定してください。大文字と小文字が区別されるパス名がオペレーティング・システムで使用される場合は、ディレクトリ名を正しい形式で指定してください。最後のスラッシュを指定する必要はありません(たとえば、/tmp/ではなく、/tmpでもかまいません)。

ディレクトリ指定では、パス内の任意の場所に".."を含めることはできません(たとえば: ../../abc/defabc/../defabc/def/hij..)。

Windowsプラットフォームの場合

Windowsプラットフォーム上では、ディレクトリ名の大/小文字が区別されません。したがって、次の2つの文は同じディレクトリを表します。

CREATE DIRECTORY "big_cap_dir" AS "g:\data\source";

CREATE DIRECTORY "small_cap_dir" AS "G:\DATA\SOURCE";

5.1.2 ディレクトリ・オブジェクトのセキュリティ

この項では、DIRECTORYオブジェクトのセキュリティについて説明します。

DIRECTORYオブジェクト・モデルには、次の2つの異なるレベルのセキュリティがあります。

  • SQL DDL: DIRECTORYオブジェクトのCREATEまたはDROP
  • SQL DML: DIRECTORYオブジェクトに対するREADシステム権限およびオブジェクト権限

DBA権限: CREATE / DROP DIRECTORY

ディレクトリ・オブジェクトは、システム所有のオブジェクトです。Oracle Databaseでは、DBAにのみ付与される次のシステム権限がサポートされています。

  • CREATE ANY DIRECTORY: ディレクトリ・オブジェクトの作成または変更用

  • DROP ANY DIRECTORY: ディレクトリ・オブジェクトの削除用

警告:

CREATE ANY DIRECTORY権限およびDROP ANY DIRECTORY権限によって、サーバーのファイル・システムがすべてのデータベース・ユーザーに公開される可能性があるため、DBAは、セキュリティ違反を防止するため、一般のデータベース・ユーザーに対するこれらの権限の付与は慎重に行う必要があります。

関連項目:

システム所有のオブジェクト、CREATE DIRECTORYおよびDROP DIRECTORYの詳細は、Oracle Database SQL言語リファレンスを参照

ユーザー権限: ディレクトリに対するREAD権限

ディレクトリ・オブジェクトに対するREAD権限によって、そのディレクトリ下に置かれたファイルを読み取ることができます。ディレクトリ・オブジェクトの作成者には、READ権限が自動的に付与されます。

GRANTオプション付きのREAD権限を付与されている場合は、その権限を他のユーザーやロールに付与して、自分の権限ドメインに追加することもできます。

ノート:

READ権限は、個々のファイルではなくディレクトリ・オブジェクトのみに定義されます。したがって、同じディレクトリ内のファイルに異なる権限を割り当てることはできません。

表される物理ディレクトリは、Oracleサーバー・プロセスに必要な、対応するオペレーティング・システム権限(この場合は読取り権限)が含まれていない場合もあります。

DBAは、次のことを確認する必要があります。

  • 物理ディレクトリの存在
  • ファイル、ディレクトリ、ディレクトリへのパスで、Oracleサーバー・プロセスに対する読取り権限が有効であること
  • データベース・ユーザーがファイルにアクセスする間は終始、ディレクトリが使用可能な状態であり、読取り権限も有効であること

ここでの権限とは、単にOracleサーバーがそのディレクトリ内のファイルを読むことができるということです。これらの権限は、実際のファイル操作時に、PL/SQLのDBMS_LOBパッケージおよびOCI APIによってチェックおよび施行されます。

関連項目:

DIRECTORYオブジェクトのカタログ・ビュー

カタログ・ビューは、DIRECTORYオブジェクト用に提供され、これによってユーザーは、オブジェクトの名前、および対応するパスおよび権限を参照できます。サポートされるビューは次のとおりです。

  • ALL_DIRECTORIES(OWNERDIRECTORY_NAMEDIRECTORY_PATH)

    このビューには、ユーザーがアクセスできるすべてのディレクトリが記述されます。

  • DBA_DIRECTORIES(OWNERDIRECTORY_NAMEDIRECTORY_PATH)

    このビューには、データベース全体について指定されたすべてのディレクトリが記述されます。