エラーが発生したときにPostgresスクリプトを停止するにはどうすればよいですか?


95

SQLスクリプトを実行するときに、スクリプトで最初のエラーが発生したときに停止するように指定する方法はありますか?以前のエラーに関係なく、通常は続行します。

回答:


156

.psqlrcに以下を追加するソリューションは完全とはほど遠い

\set ON_ERROR_STOP on

よりシンプルで便利な方法が存在します-パラメータを指定してpsqlを使用します:

psql -v ON_ERROR_STOP=1

-X.psqlrcファイルの使用をオフにするパラメーターも使用することをお勧めします。私にとっては完璧に機能します

ps Peter Eisentrautのすばらしい投稿で見つかった解決策。ピーター、ありがとう! http://petereisentraut.blogspot.com/2010/03/running-sql-scripts-with-psql.html


8
-v ON_ERROR_STOP=ON少なくとも9.2でも動作します。ブールの「true」のバリアントは許可されていると思います。
jpmc26 2014

インタラクティブモードでは機能しないため、しばらく混乱しました。
Sam Watkins

21

私はあなたがを使用していると思いますpsql、これはあなたの~/.psqlrcファイルに追加するのに便利かもしれません。

\set ON_ERROR_STOP on

これにより、最初のエラーで中止されます。それがない場合は、トランザクションがあってもスクリプトは実行され続けますが、スクリプトの最後まですべてが失敗します。

そして、ポールが言ったようにあなたはおそらくトランザクションを使いたいでしょう。これpsql --single-transaction ...は、スクリプトを変更したくない場合にも使用できます。

したがって、.psqlrcにON_ERROR_STOPを指定した完全な例:

psql --single-transaction --file /your/script.sql

2
トランザクションが失敗した場合でも、psqlのコマンドの終了ステータスは、まだ0です
博士は人人IIは、

4
実際、--single-transaction使用されている場合でも、-v ON_ERROR_STOP=1ゼロ以外の存在ステータスに は依然として必要です
bitek

8

それはあなたが望むものではありませんが、スクリプトをで開始してbegin transaction;で終了するとend transaction;、最初のエラーの後にすべてを実際にスキップし、エラーの前に行ったすべてをロールバックします。


確かに、しかし、それはまだすべてを解析します。そして、最初のトランザクションが成功した場合にのみ2番目のトランザクションを実行する場合、これは機能しません。
ワイルドカード2017年

はい。DDLCreate table errrr ...(バージョン:postrgres 10)が発生したときに続行することを忘れないでください。はい、1つのテーブルをスキップして他のテーブルに進みます...
JL Peyret

0

私はいつもマニュアルを直接参照するのが好きです。

PostgreSQLマニュアルから:

終了ステータス

psqlは、正常に終了した場合はシェルに0を返し、1自体の致命的なエラー(メモリ不足、ファイルが見つからないなど)が発生した場合は2、サーバーへの接続が不良でセッションが対話的でない場合は2、スクリプトでエラーが発生し、変数ON_ERROR_STOPが設定されました。

デフォルトでは、PostgreSQLサーバーエラーで実行しているSQLコードの場合、psqlはエラーを終了しません。エラーをキャッチして続行します。上記のようにON_ERROR_STOP設定をオンに設定した場合、psqlがSQLコードでエラーをキャッチすると、終了3してシェルに戻ります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.