Я использую Postgresql с расширениями PostGIS для специального пространственного анализа. Я обычно создаю и выпускаю SQL-запросы вручную из psql. Я всегда переношу аналитическую сессию в рамках транзакции, поэтому если я выпускаю разрушительный запрос, я могу откатывать его.
Однако, когда я выпускаю запрос, который содержит ошибку, это отменяет транзакцию. Дальнейшие запросы выявляют соблюдающее предупреждение:
ОШИБКА: текущая транзакция прерывается, управляет проигнорированный до конца блока транзакции
Существует ли способ, которым я могу выключить это поведение? Это утомительно, чтобы откатывать транзакцию и повторно выполнить предыдущие запросы каждый раз, когда я делаю опечатку.
(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)
Можно написать функцию, которая принимает строковый аргумент, выполняет его и использует условие исключения , чтобы не прерывать транзакцию, но тогда это очень сложно. должны вызывать эту функцию для каждого оператора, который вы хотите выполнить.
Выключить это невозможно, но вы можете использовать что-то другое. Есть что-то вроде точки сохранения:
http://www.postgresql.org/docs/8.4/interactive/sql-savepoint.html
, чтобы вы могли откатить свою транзакцию до некоторой более ранней точки, не отбрасывая всю транзакцию черным цветом.
Нет, отключить это невозможно. Ошибка неявно прерывает транзакцию для вас, поэтому вы должны откатиться и попробовать снова.