Ведение журнала ошибок SQL-скрипта - PullRequest
1 голос
/ 15 ноября 2011

У меня есть скрипт SQL для файла postgres со следующей командой.

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

Я хочу обработать ошибки этой команды (зарегистрировать ошибку)

пример

ОШИБКА: нарушение дублирующего значения ключа.

Возвращает ли команда COPY какое-либо значение?Если нет, то как записать вывод сценария оболочки?

1 Ответ

2 голосов
/ 16 ноября 2011

Вы можете регистрировать любые сообщения (ошибки, предупреждения и т. Д.) С множеством дополнительной информации в файле журнала базы данных .Это стандартное поведение.Конечно, ваш кластер базы данных должен быть настроен для этого. Прочтите подробное руководство здесь .

В зависимости от клиента вы также сможете получать сообщений об ошибках в качестве прямого ответа от сервера базы данных.Обратите внимание, что ошибки сообщаются в другом потоке, чем вывод данных.Как 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 на производительном сервере.Это создает огромных файлов журналов.

...