【发布时间】:2011-05-27 16:39:11
【问题描述】:
有没有办法指定在执行sql脚本时遇到脚本第一个错误就停止,通常会继续,不管以前的错误。
【问题讨论】:
标签: postgresql error-handling psql
有没有办法指定在执行sql脚本时遇到脚本第一个错误就停止,通常会继续,不管以前的错误。
【问题讨论】:
标签: postgresql error-handling psql
我认为将以下内容添加到 .psqlrc 的解决方案远非完美
\set ON_ERROR_STOP on
还有更简单方便的方法 - 使用带参数的 psql:
psql -v ON_ERROR_STOP=1
更好地使用-X 参数关闭.psqlrc 文件的使用。
非常适合我
附言在 Peter Eisentraut 的精彩帖子中找到的解决方案。谢谢你,彼得! http://petereisentraut.blogspot.com/2010/03/running-sql-scripts-with-psql.html
【讨论】:
-v ON_ERROR_STOP=ON 也有效,至少在 9.2 中有效。我怀疑任何variants of boolean "true" 都是允许的。
我假设您使用的是psql,这可能很方便添加到您的~/.psqlrc 文件中。
\set ON_ERROR_STOP on
这将使它在第一个错误时中止。如果你没有它,即使有事务,它也会继续执行你的脚本,但在脚本结束之前一切都会失败。
你可能想使用 Paul 所说的事务。如果您不想更改脚本,也可以使用psql --single-transaction ... 来完成。
这是一个完整的例子,在你的 .psqlrc 中有 ON_ERROR_STOP:
psql --single-transaction --file /your/script.sql
【讨论】:
--single-transaction,-v ON_ERROR_STOP=1 仍然是非零存在状态所必需的
这并不是你想要的,但是如果你以begin transaction; 开始你的脚本并以end transaction; 结束,它实际上会跳过第一个错误之后的所有内容,然后它会回滚它在错误之前所做的所有事情。
【讨论】:
我总是喜欢直接参考手册。
退出状态
psql 如果正常完成则返回 0 到 shell,如果是致命的则返回 1 发生自身的错误(例如内存不足、未找到文件),如果 与服务器的连接坏了,会话没有交互, 和 3 如果脚本和变量中发生错误 ON_ERROR_STOP 已设置。
默认情况下,如果你在 PostgreSQL 服务器上运行的 sql 代码错误 psql 不会退出错误。它将捕获错误并继续。如果如上所述,您将 ON_ERROR_STOP 设置为 on,当 psql 在 sql 代码中捕获错误时,它将退出并将 3 返回到 shell。
【讨论】: