gpt4 book ai didi

postgresql - 如何为 psql 脚本的一部分暂停 PostgreSQL 的 ON_ERROR_STOP?

转载 作者:行者123 更新时间:2023-11-29 13:12:49 25 4
gpt4 key购买 nike

我正在维护一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com