Відповіді:
Я думаю, що рішення для додавання наступного в .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;
, він фактично пропустить все після першої помилки, а потім відкатить усе, що робив до помилки.
Я завжди люблю посилатися на посібник безпосередньо.
Статус виходу
psql повертає 0 до оболонки, якщо вона закінчилася нормально, 1, якщо виникає власна фатальна помилка (наприклад, не вистачає пам’яті, файл не знайдено), 2 якщо з’єднання з сервером пішло погано і сеанс не був інтерактивним, і 3, якщо сталася помилка у сценарії, і встановлено змінну ON_ERROR_STOP.
За замовчуванням, якщо код SQL, який ви використовуєте на помилці сервера PostgreSQL, psql не виведе помилку. Це виявить помилку і продовжить. Якщо, як уже згадувалося вище, ви встановите ON_ERROR_STOP
параметр увімкнено, коли psql виявить помилку в коді sql, він вийде і повернеться 3
до оболонки.
-v ON_ERROR_STOP=ON
також працює, принаймні з 9.2. Я підозрюю, що будь-який із варіантів логічного "true" дозволений.