2011-11-15 10 views
1

次のコマンドでpostgresファイル用のSQLスクリプトがあります。SQLスクリプトエラーをログに記録する

私は、このコマンドのエラーを処理したい
COPY product_master(productId, productName) FROM 'product.txt' DELIMITERS ',' CSV; 

(エラー・ログ)

ERROR: duplicate key value violates.

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

答えて

2

データベースログファイルには、追加の情報を含むすべてのメッセージ(エラー、警告、..)を記録できます。これは標準的な動作です。もちろん、あなたのデータベースクラスタはそうするように構成されなければなりません。 Read the fine manual here

お客様のクライアントには、エラーメッセージをデータベースサーバーからの直接回答として取得する必要があります。エラーは、データ出力とは異なるストリームで報告されることに注意してください。シェル内にはstoutstderrがあります。

シェルからスクリプトを実行するには、おそらく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 

出力はさまざまに依存しますsettings like 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を使用することはありません。それは巨大なログファイルを生成します。

関連する問題