Есть ли способ указать, что при выполнении сценария sql он останавливается при обнаружении первой ошибки в сценарии, он обычно продолжается, независимо от предыдущих ошибок.
Ответы:
Я думаю, что решение добавить следующее в .psqlrc далеко от совершенства
\set ON_ERROR_STOP on
есть гораздо более простой и удобный способ - использовать psql с параметром:
psql -v ON_ERROR_STOP=1
Лучше использовать также -X
параметр, отключающий использование файла .psqlrc. Отлично работает для меня
ps решение найдено в отличном посте от Питера Эйзентраута. Спасибо, Питер! http://petereisentraut.blogspot.com/2010/03/running-sql-scripts-with-psql.html
Я предполагаю, что вы используете psql
, это может быть удобно для добавления в ваш ~/.psqlrc
файл.
\set ON_ERROR_STOP on
Это приведет к прерыванию работы при первой ошибке. Если у вас его нет, даже с транзакцией он продолжит выполнение вашего скрипта, но не сможет выполнить все до конца вашего скрипта.
И вы, вероятно, захотите использовать транзакцию, как сказал Пол. Что также можно сделать, psql --single-transaction ...
если вы не хотите изменять сценарий.
Итак, полный пример с ON_ERROR_STOP в вашем .psqlrc:
psql --single-transaction --file /your/script.sql
--single-transaction
используется, -v ON_ERROR_STOP=1
все равно необходимо для ненулевого статуса существования
Это не совсем то, что вы хотите, но если вы начнете свой скрипт с begin transaction;
и закончите end transaction;
, он фактически пропустит все после первой ошибки, а затем откатит все, что он делал до ошибки.
Я всегда люблю напрямую обращаться к руководству.
Из руководства PostgreSQL :
Статус выхода
psql возвращает оболочке 0, если она завершилась нормально, 1, если произошла собственная фатальная ошибка (например, нехватка памяти, файл не найден), 2, если соединение с сервером ухудшилось и сеанс не был интерактивным, и 3, если в скрипте произошла ошибка и была установлена переменная ON_ERROR_STOP.
По умолчанию, если код sql, который вы запускаете на сервере PostgreSQL, ошибается, psql не выдает ошибку. Он перехватит ошибку и продолжит работу. Если, как упоминалось выше, вы установите для этого ON_ERROR_STOP
параметра значение on, когда psql обнаружит ошибку в коде sql, он выйдет и вернется 3
в оболочку.
-v ON_ERROR_STOP=ON
тоже работает, по крайней мере, с 9.2. Я подозреваю , что допустимы любые варианты логического "истина" .