file_fdwモジュールは、サーバのファイルシステムにあるデータファイルにアクセスするのに使用できる外部データラッパfile_fdwを提供します。
サーバのファイルにアクセスしたり、サーバ上のプログラムを実行して出力を読み取ったりできます。
データファイルはCOPY FROMで読むことのできるフォーマットでなければなりません。
詳細は COPY を参照してください。
データファイルへのアクセスは現時点では読み取り専用です。
このラッパーで作成された外部テーブルには以下のオプションを設定することができます。
filename読み取るファイルを指定します。
絶対パスでなければなりません。
filenameかprogramのどちらかを指定できますが、両方は指定できません。
program実行するコマンドを指定します。
このコマンドの標準出力をCOPY FROM PROGRAMが使用されたかのように読み込みます。
programかfilenameのどちらかを指定できますが、両方は指定できません。
formatデータフォーマットを指定するもので、COPYのFORMATオプションと同じです。
headerデータがヘッダ行を持つか指定するもので、COPYのHEADERオプションと同じです。
delimiterデータの区切り文字を指定するもので、COPYのDELIMITERオプションと同じです。
quoteデータの引用符文字を指定するもので、COPYのQUOTEオプションと同じです。
escapeデータのエスケープ文字を指定するもので、COPYのESCAPEオプションと同じです。
nullデータのNULL文字列を指定するもので、COPYのNULLオプションと同じです。
encodingデータのエンコーディングを指定するもので、COPYのENCODINGオプションと同じです。
COPYではHEADERといったオプションを対応する値なしで指定できるのに対して、外部データラッパの構文では全ての場合において値を指定する必要がある点に注意してください。
通常の値なしで指定されるCOPYオプションを有効にするには、そのようなオプションはすべてbooleanであるため、代わりにTRUEを渡すことができます。
このラッパーを使って作られた外部テーブルのカラムは、以下のオプションを持つことができます。
force_not_nullこれはbooleanオプションです。
真の場合は、このカラムの値はNULL文字列(これはテーブルレベルのnullオプションです)と比較されません。
これは、COPYのFORCE_NOT_NULLオプションに列名を指定するのと同じ効果があります。
force_nullこれはbooleanオプションです。
真の場合、NULL文字列と一致するこのカラムの値は、たとえ引用符で括られていたとしてもNULLと返されます。
このオプションがなければ、NULL文字列と一致する引用符で括られていない値のみがNULLと返されます。
これは、COPYのFORCE_NULLオプションに列名を指定するのと同じ効果があります。
COPYのOIDS、FORCE_QUOTEの各オプションはfile_fdwでは現在サポートされていません。
これらのオプションは外部テーブルまたはその列にのみ指定可能で、file_fdw外部データラッパやそれを使用するサーバ、ユーザマッピングのオプションには指定できません。
どのファイルから読み込むか、又はプログラムを実行するかをコントロールできるのはスーパーユーザーのみでなければならない、というセキュリティ上の理由から、テーブルレベルのオプションを変更するにはスーパーユーザ権限が必要です。 原則としては非スーパーユーザはその他のオプションを変更することを許されてもよいのですが、現時点ではサポートされていません。
programオプションが指定されたとき、オプションの文字列がシェルによって実行されることに注意してください。
信頼できないソースをコマンド引数に渡す場合、シェルにとって特別な意味を持つ可能性のある文字を取り除くかエスケープするように注意する必要があります。
セキュリティ上の理由から、固定のコマンド文字列を使用するか、少なくともユーザー入力を渡さないようにすることをお勧めします。
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/data/log/pglog.csv', format 'csv' );
これで全てです。 もうあなたはログに直接検索を実行することができます。 実運用においては、もちろんログローテーションを処理する方法を定義する必要があるでしょう。