作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在维护一个 psql
脚本,我通常希望在它的任何部分失败时立即以非零退出代码中止。
所以我正在考虑去哪个地方
\set ON_ERROR_STOP on
在开头,或指示用户运行脚本
psql -v ON_ERROR_STOP=on -f my_script.sql
但是,脚本的一部分故意失败(并回滚)。由于该脚本用于教育和演示目的,并且该部分演示了 CONSTRAINT 实际上按其应有的方式工作(通过使随后的违反约束的 INSERT 失败),我无法真正“修复”该部分以使其不失败,因此接受了 How to save and restore value of ON_ERROR_STOP? 的回答没有解决我的问题。
因此,我想在该部分之前禁用 ON_ERROR_STOP
并在该部分之后恢复设置。如果我知道 ON_ERROR_STOP
通常处于启用状态,这很容易:
\set ON_ERROR_STOP off
BEGIN;
-- [ part of the script that purposfully fails ]
ROLLBACK;
\set ON_ERROR_STOP on
或
\unset ON_ERROR_STOP
BEGIN;
-- [ part of the script that purposefully fails ]
ROLLBACK;
\set ON_ERROR_STOP on
但是,这会盲目地(重新)启用 ON_ERROR_STOP
,无论之前是否启用过。
\set previous_ON_ERROR_STOP :ON_ERROR_STOP
\unset ON_ERROR_STOP
BEGIN;
-- [ part of the script that purposefully fails ]
ROLLBACK;
\set ON_ERROR_STOP :previous_ON_ERROR_STOP
如果 ON_ERROR_STOP
之前已被明确禁用(例如,设置为 off
),则有效,但如果未设置(因此只是隐式禁用),则失败。
我希望脚本保持向后兼容 PostgreSQL 9.x,所以我还不能使用 PostgreSQL 10 中引入的 \if
元命令。
最佳答案
我认为你做不到。
然而,您可以做的是使用 PL/pgSQL block 来运行语句并捕获并报告错误,有点像这样:
DO
$$BEGIN
INSERT INTO mytab VALUES (...);
EXCEPTION
WHEN integrity_constraint_violation THEN
RAISE NOTICE 'Caught error: %', SQLERRM;
END;$$;
这将报告错误,但不会导致 psql
停止。
关于postgresql - 如何为 psql 脚本的一部分暂停 PostgreSQL 的 ON_ERROR_STOP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52743033/
我是一名优秀的程序员,十分优秀!