пятница, 18 марта 2016 г.

psql и ON_ERROR_ROLLBACK

Название этой psql-переменной подсказывает, что если ее установить, то ошибочная команда будет приводить к откату транзакции: при ошибке - откат.
Как-то так:

postgres=# begin;
BEGIN
postgres=# select1+1;
ERROR:  syntax error at or near "select1"
LINE 1: select1+1;
        ^
postgres=# commit;
ROLLBACK


Такое поведение psql сильно раздражает. Из-за любой случайной ошибки при наборе команды приходится терять всю транзакцию.
Только вот переменная ON_ERROR_ROLLBACK не виновница, а наоборот, призвана помочь в таких ситуациях.

postgres=# \set ON_ERROR_ROLLBACK ON
postgres=# begin;
BEGIN
postgres=# select1+1;
ERROR:  syntax error at or near "select1"
LINE 1: select1+1;
        ^
postgres=# commit;
COMMIT


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

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


Строка \set ON_ERROR_ROLLBACK INTERACTIVE определенно заслуживает место в .psqlrc

Комментариев нет: