Я могу попросить, чтобы Postgresql проигнорировал ошибки в рамках транзакции

Я использую Postgresql с расширениями PostGIS для специального пространственного анализа. Я обычно создаю и выпускаю SQL-запросы вручную из psql. Я всегда переношу аналитическую сессию в рамках транзакции, поэтому если я выпускаю разрушительный запрос, я могу откатывать его.

Однако, когда я выпускаю запрос, который содержит ошибку, это отменяет транзакцию. Дальнейшие запросы выявляют соблюдающее предупреждение:

ОШИБКА: текущая транзакция прерывается, управляет проигнорированный до конца блока транзакции

Существует ли способ, которым я могу выключить это поведение? Это утомительно, чтобы откатывать транзакцию и повторно выполнить предыдущие запросы каждый раз, когда я делаю опечатку.

15
задан fmark 30 April 2010 в 02:14
поделиться

4 ответа

(UPDATE: Не нужно делать это вручную, я спросил в списках рассылки postgresql, и оказалось, что это поведение уже реализовано, с помощью ON_ERROR_ROLLBACK, установленного в psql-клиенте)

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

Пример такой схемы работы:

db=# select * from test_gral ;
 i |  t   |  n
---+------+------
 1 | text | 10.0
(1 row)

db=# begin;
BEGIN
db=#  insert into test_gral values (2,'xx',20); savepoint sp;
INSERT 0 1
SAVEPOINT
db=#  insert into test_gral values (3,'xx',30); savepoint sp;
INSERT 0 1
SAVEPOINT
db=#  insert into test_gralxx values (4,'xx',40); savepoint sp;
ERROR:  relation "test_gralxx" does not exist
LINE 1: insert into test_gralxx values (4,'xx',40);
                    ^
ERROR:  current transaction is aborted, commands ignored until end of transaction block
db=# ROLLBACK TO SAVEPOINT sp;
ROLLBACK
db=#  insert into test_gral values (4,'xx',40); savepoint sp;
INSERT 0 1
SAVEPOINT
db=# commit;
COMMIT
db=# select * from test_gral ;
 i |  t   |  n
---+------+------
 1 | text | 10.0
 2 | xx   |   20
 3 | xx   |   30
 4 | xx   |   40
(4 rows)
11
ответ дан 1 December 2019 в 03:52
поделиться

Можно написать функцию, которая принимает строковый аргумент, выполняет его и использует условие исключения , чтобы не прерывать транзакцию, но тогда это очень сложно. должны вызывать эту функцию для каждого оператора, который вы хотите выполнить.

2
ответ дан 1 December 2019 в 03:52
поделиться

Выключить это невозможно, но вы можете использовать что-то другое. Есть что-то вроде точки сохранения:

http://www.postgresql.org/docs/8.4/interactive/sql-savepoint.html

, чтобы вы могли откатить свою транзакцию до некоторой более ранней точки, не отбрасывая всю транзакцию черным цветом.

6
ответ дан 1 December 2019 в 03:52
поделиться

Нет, отключить это невозможно. Ошибка неявно прерывает транзакцию для вас, поэтому вы должны откатиться и попробовать снова.

0
ответ дан 1 December 2019 в 03:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: