2010-12-18 24 views
65

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

おかげ

答えて

5

それはあなたが望むものを正確ではありませんが、あなたはbegin transaction;でスクリプトを起動して、end transaction;で終わるならば、それは実際には最初のエラーの後、すべてをスキップし、それはそれはエラーの前にいたすべてのものをロールバックされます。

+0

本当ですが、それでもすべてが解析されます。そして、最初のトランザクションが成功した場合にのみ* 2番目のトランザクションを実行したい場合、これは機能しません。 – Wildcard

12

あなたはpsqlを使用していると仮定しますが、これは~/.psqlrcファイルに追加すると便利です。

\set ON_ERROR_STOP on 

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

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

だから完全な例では、あなたの.psqlrcでON_ERROR_STOPで:

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

トランザクションが失敗した場合でも、psqlコマンドの終了ステータスは0です。 –

+3

実際、 '--single-transaction'が使用されても、ゼロ以外の存在ステータスの場合には' -v ON_ERROR_STOP = 1 'はまだ必要です – bitek

104

私は

\set ON_ERROR_STOP on 

はるかにシンプルかつ存在完璧にはほど遠いソリューションは.psqlrcに以下を追加することだと思います便利な方法 - パラメータ付きのpsqlを使用する:

psql -v ON_ERROR_STOP=1 

-Xパラメータは.psqlrcファイルの使用をオフにします。 私にとって完璧に動作します

p.s.このソリューションはPeter Eisentrautの素晴らしい投稿にあります。ありがとう、ピーター! http://petereisentraut.blogspot.com/2010/03/running-sql-scripts-with-psql.html

+4

'-v ON_ERROR_STOP = ON'も少なくとも9.2で動作します。私は、ブール値「真」のバリエーション(http://www.postgresql.org/docs/9.2/static/datatype-boolean.html)が許されていると思われます。 – jpmc26

+0

インタラクティブモードでは動作しません。これは分かりました。 –

+0

ありがとうございます。-v ON_ERROR_STOP = 1 -xを追加すると、私のために動作します。 – netto

関連する問題