2

トリガー関数内でテキスト ファイルのデータにアクセスできる方法はありますか?

4

3 に答える 3

4

これには、標準の 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;
于 2012-10-27T07:34:47.080 に答える
1

はい。ただし、信頼できない言語pl / sh、pl / perlu、Cなどのいずれかが必要になります。

これを行う必要がある理由を説明すると、より良い方法があるかもしれません。

于 2012-10-27T07:16:14.617 に答える
0

基本的なファイル I/O には、私の「PostgreSQL File I/O Functions」拡張機能を使用できます。

免責事項:私はこの拡張機能の作成者であり、問​​題の解決策として提供しています。

于 2015-02-28T15:10:02.483 に答える