データベースログファイルには、追加の情報を含むすべてのメッセージ(エラー、警告、..)を記録できます。これは標準的な動作です。もちろん、あなたのデータベースクラスタはそうするように構成されなければなりません。 Read the fine manual here。
お客様のクライアントには、エラーメッセージをデータベースサーバーからの直接回答として取得する必要があります。エラーは、データ出力とは異なるストリームで報告されることに注意してください。シェル内には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
を
出力はさまざまに依存します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
を使用することはありません。それは巨大なログファイルを生成します。