トリガー関数内でテキスト ファイルのデータにアクセスできる方法はありますか?
3 に答える
これには、標準の plpgsql 関数を使用できます。
コピー
CSV ファイル (または類似のファイル) について話している場合、そのファイルは使用する db サーバー上にありますCOPY
。ここにマニュアルを引用します。
ファイル名を指定した COPY は、PostgreSQL サーバーにファイルから直接読み書きするように指示します。ファイルはサーバーからアクセス可能である必要があり、名前はサーバーの観点から指定する必要があります。
より複雑な操作の場合、一時テーブルをステージング テーブルとして使用し、COPY
そこにファイルを挿入して、そこからプレーンな SQL コマンドを操作することができます。この例に似ています。ただし、同じセッションで同じテーブルを複数回作成しようとして競合が発生しないようにしてください...
pg_read_file()
一般的なファイル アクセス関数もあります。セキュリティ上の理由から、それらの使用はかなり制限されています。
データベース クラスタ ディレクトリと log_directory 内のファイルのみにアクセスできます。クラスター ディレクトリ内のファイルには相対パスを使用し、ログ ファイルには log_directory 構成設定と一致するパスを使用します。これらの機能の使用は、スーパーユーザーに制限されています。
これを使用して、小さな XML ファイルを読み取り、PostgreSQL 内で処理します。デモ:
CREATE OR REPLACE FUNCTION f_import_from_file()
RETURNS boolean AS
$BODY$
DECLARE
myxml xml;
datafile text := 'path/relative/to/db_cluster/myfile.xml';
BEGIN
myxml := pg_read_file(datafile, 0, 10000000); -- 10 MB max.
-- do stuff, like INSERT ...
$BODY$
db ディレクトリから他のディレクトリへのシンボリックリンクを使用して、パスの制限を克服できます。ただし、セキュリティへの影響の可能性には注意してください。
file_fdw
最後に、外部データ ラッパーを使用して、サーバーのファイル システム内のデータ ファイルにアクセスできます。これには追加のモジュールが必要ですfile_fdw
。以下を使用して、データベースごとに 1 回インストールします。
CREATE EXTENSION file_fdw;
はい。ただし、信頼できない言語pl / sh、pl / perlu、Cなどのいずれかが必要になります。
これを行う必要がある理由を説明すると、より良い方法があるかもしれません。
基本的なファイル I/O には、私の「PostgreSQL File I/O Functions」拡張機能を使用できます。
免責事項:私はこの拡張機能の作成者であり、問題の解決策として提供しています。