file_fdwモジュールは、サーバのファイルシステムにあるデータファイルにアクセスするのに使用できる外部データラッパfile_fdwを提供します。
データファイルはCOPY FROMで読むことのできるフォーマットでなければなりません。
詳細は COPY を参照してください。
そのようなデータへのアクセスは現時点では読み取り専用です。
このラッパーで作成された外部テーブルには以下のオプションを設定することができます。
filename読み込むファイルを指定します。 必須です。 絶対パスでなければなりません。
formatファイルフォーマットを指定するもので、COPYのFORMATオプションと同じです。
headerファイルがヘッダ行を持つか指定するもので、COPYのHEADERオプションと同じです。
delimiterファイルのデリミタ文字を指定するもので、COPYのDELIMITERオプションと同じです。
quoteファイルの引用符文字を指定するもので、COPYのQUOTEオプションと同じです。
escapeファイルのエスケープ文字を指定するもので、COPYのESCAPEオプションと同じです。
nullファイルのnull文字列を指定するもので、COPYのNULLオプションと同じです。
encodingファイルのエンコーディングを指定するもので、COPYのENCODINGオプションと同じです。
COPYではOIDSやHEADERといったオプションを対応する値なしで指定できるのに対して、外部データラッパの構文では全ての場合において値を指定する必要がある点に注意してください。
通常値なしで指定されるCOPYオプションを有効にするには、代わりにTRUEを渡すことができます。
このラッパーを使って作られた外部テーブルのカラムは、以下のオプションを持つことができます。
force_not_nullこれはbooleanオプションです。
真の場合は、このカラムの値はヌル値文字列(これはファイルレベルのnullオプションです)と比較されません。
これは、COPYのFORCE_NOT_NULLオプションに列名を指定するのと同じ効果があります。
force_nullこれはbooleanオプションです。
真の場合、ヌル値文字列と一致するこのカラムの値は、たとえ引用符で括られていたとしてもNULLと返されます。
このオプションがなければ、ヌル値文字列と一致する引用符で括られていない値のみがNULLと返されます。
これは、COPYのFORCE_NULLオプションに列名を指定するのと同じ効果があります。
COPYのOIDS、FORCE_QUOTEの各オプションはfile_fdwでは現在サポートされていません。
これらのオプションは外部テーブルまたはその列にのみ指定可能で、file_fdw外部データラッパやそれを使用するサーバ、ユーザマッピングのオプションには指定できません。
どのファイルから読み込むかを決定できるのはスーパーユーザーのみでなければならない、というセキュリティ上の理由から、テーブルレベルのオプションを変更するにはスーパーユーザ権限が必要です。 原則としては非スーパーユーザはその他のオプションを変更することを許されてもよいのですが、現時点ではサポートされていません。
file_fdwを使用する外部テーブルでは、EXPLAINは読み込むファイルの名前を表示します。
COSTS OFFが指定されない場合は(バイト単位の)ファイルサイズも表示されます。
例F.1 PostgreSQL CSV ログ用の外部テーブル作成
file_fdwの明確な用途の一つはPostgreSQLの活動ログをテーブルとして検索できるようにすることです。
これを実現するには、ここではpglog.csvと呼ぶCSVファイルにログを記録している必要があります。
まず、file_fdwをエクステンションとしてインストールします。
CREATE EXTENSION file_fdw;
続いて外部サーバを作成します。
CREATE SERVER pglog FOREIGN DATA WRAPPER file_fdw;
これで外部テーブルを作成する準備ができました。
CREATE FOREIGN TABLEコマンドを使って、テーブルのカラム、CSVファイル名とそのフォーマットを定義する必要があるでしょう。
CREATE FOREIGN TABLE pglog ( log_time timestamp(3) with time zone, user_name text, database_name text, process_id integer, connection_from text, session_id text, session_line_num bigint, command_tag text, session_start_time timestamp with time zone, virtual_transaction_id text, transaction_id bigint, error_severity text, sql_state_code text, message text, detail text, hint text, internal_query text, internal_query_pos integer, context text, query text, query_pos integer, location text, application_name text ) SERVER pglog OPTIONS ( filename '/home/josh/9.1/data/pg_log/pglog.csv', format 'csv' );
これで全てです—もうあなたはログに直接検索を実行することができます。 実運用においては、もちろん何らかの方法でログを切り替える必要があるでしょう。