2010-12-18 149 views
65

有沒有一種方法可以指定執行sql腳本時遇到腳本的第一個錯誤時停止,它通常會繼續,無論以前的錯誤如何。Postgres sql腳本錯誤失敗

感謝

回答

5

這不正是你想要的,但如果你有begin transaction;開始你的腳本,並與end transaction;結束,它實際上將第一個錯誤後跳過一切,然後它會回滾它的錯誤之前所做的一切。

+0

是的,但它仍然解析了一切。如果您只想在第一次成功時執行第二次*事務,則這不起作用。 – Wildcard 2017-05-06 04:22:28

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. – 2011-06-06 05:30:13

+3

事實上,即使使用'--single-transaction',對於非零存在狀態,'-v ON_ERROR_STOP = 1'仍然是必需的 – bitek 2015-03-04 09:54:52

104

我認爲解決方案添加以下內容.psqlrc遠未完善

\set ON_ERROR_STOP on 

存在更簡單方便的方法 - 使用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。我懷疑任何[boolean「true」]變體(http://www.postgresql.org/docs/9.2/static/datatype-boolean.html)都是允許的。 – jpmc26 2014-02-14 11:38:11

+0

它不能在交互模式下工作,這讓我困惑了一分鐘。 – 2015-07-30 05:47:04

+0

謝謝,添加-v ON_ERROR_STOP = 1 -x適用於我。 – netto 2017-05-06 03:41:36