1

有没有办法保存,临时更改,然后恢复psql ON_ERROR_STOP变量的值?

基本上,我想在psql脚本中包含以下内容的“道德等价物”:

save_on_error_stop=ON_ERROR_STOP

\unset ON_ERROR_STOP
ALTER TABLE foo DROP COLUMN bar;  -- (for example)
\set ON_ERROR_STOP save_on_error_stop

ALTER TABLE foo ADD COLUMN bar;

关键是'\set'最后的命令实际上不会设置ON_ERROR_STOP,除非它是之前设置的。

4

1 回答 1

2

我认为不可能在一个psql会话中做到这一点。根据手册,可以自己使用\set命令来列出所有psql变量。

可以记住 shell 中的设置,但这会使整个事情变得毫无用处,因为执行所需的一组查询来执行所需的ON_ERROR_STOP值要简单得多。

另一种选择是编写一个匿名代码块和DO一些额外的逻辑来检测是否需要在添加之前删除列。

顺便说一句,直接删除和添加列的目的是什么?


如果只是为了确保不存在这样的列,那么这个DO块如何:

DO $$
BEGIN
IF NOT EXISTS (
    SELECT 1 FROM information_schema.columns
     WHERE table_schema='public' AND table_name='foo'
       AND column_name='bar')
THEN
    EXECUTE format('ALTER TABLE %I.%I ADD %I text',
                   'public','foo','bar');
END IF;
END; $$;

如果您倾向于经常进行此类检查,您也可以创建一个函数。

于 2013-02-06T14:16:46.810 回答