1

次のコマンドを使用したpostgresファイルのSQLスクリプトがあります。

COPY product_master(productId, productName) FROM 'product.txt' DELIMITERS ',' CSV; 

このコマンドのエラーを処理したい(エラーをログに記録する)

エラー:重複するキー値に違反しています。

コマンドはCOPY値を返しますか?いいえの場合、シェルスクリプトの出力をログに記録する方法は?

4

1 に答える 1

2

すべてのメッセージ (エラー、警告など) をデータベース ログ ファイルに大量の追加情報とともに記録できます。これは標準的な動作です。もちろん、データベース クラスタはそのように構成する必要があります。ここで細かいマニュアルを読んでください

クライアントによっては、データベース サーバーからの直接の応答としてエラー メッセージを取得できるはずです。エラーは、データ出力とは異なるストリームで報告されることに注意してください。とシェルのようstoutに。stderr

シェルからはpsql -f、スクリプトを実行するためにおそらく呼び出します。このデモで何が起こるか見てみましょう:

シェルでダミーの SQL スクリプトを作成します。

vim test.sql

このようなものをそれに入れます:

CREATE temp table x (a int primary key, b int);
insert into x values (1,2),(3,4);
COPY x TO '/var/lib/postgres/dev/test.out';
COPY x FROM '/var/lib/postgres/dev/test.out';

それを実行します:

psql mydb -f test.sql

出力は、次のようなさまざまな設定client_min_messagesに依存します。

psql:test.sql:2: NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "x_pkey" for table "x"
CREATE TABLE
INSERT 0 2
psql:test.sql:4: ERROR:  duplicate key value violates unique constraint "x_pkey"
KONTEXT:  COPY x, line 1: "1    2"

log_statement = all(とりわけ)構成したので、サーバーログは次のようになります。

2011-11-15 22:36:23 CET postgres LOG:  statement: CREATE temp table x (a int primary key, b int);
2011-11-15 22:36:23 CET postgres LOG:  statement: insert into x values (1,2),(3,4);
2011-11-15 22:36:23 CET postgres LOG:  statement: COPY x FROM '/var/lib/postgres/dev/test.out';
2011-11-15 22:36:23 CET postgres ERROR:  duplicate key value violates unique constraint "x_pkey"
2011-11-15 22:36:23 CET postgres CONTEXT:  COPY x, line 1: "1  2"
2011-11-15 22:36:23 CET postgres STATEMENT:  COPY x FROM '/var/lib/postgres/dev/test.out';

log_statement = all生産的なサーバーでは使用しません。これにより、巨大なログ ファイルが生成されます。

于 2011-11-15T21:50:16.863 に答える