2010-12-18 146 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