记录SQL脚本错误

时间:2011-11-15 06:40:45

标签: sql postgresql sql-scripts

我有一个带有以下命令的postgres文件的SQL脚本。

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

我想处理此命令的错误(记录错误)

示例

  

错误:重复的密钥值违反。

COPY命令是否返回任何值?如果没有,那么如何记录shell脚本的输出?

1 个答案:

答案 0 :(得分:2)

您可以在数据库日志文件中记录任何和所有消息(错误,警告,...)以及大量其他信息。这是标准行为。当然,您的数据库集群必须配置为执行此操作。 Read the fine manual here

根据您的客户端,您还应该能够从数据库服务器获得错误消息作为直接答案。请注意,错误报告在与数据输出不同的流上。与shell中的stoutstderr一样。

shell ,您可能会调用psql -f来执行脚本。看看这个演示中发生了什么:

在shell中创建一个虚拟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。这会生成巨大的日志文件。