Postgresql 如何保存和恢复ON_ERROR_STOP的值?
是否有办法保存、临时更改并恢复psql ON\u ERROR\u STOP变量的值 基本上,我希望在psql脚本中具有以下道德等价物:Postgresql 如何保存和恢复ON_ERROR_STOP的值?,postgresql,psql,Postgresql,Psql,是否有办法保存、临时更改并恢复psql ON\u ERROR\u STOP变量的值 基本上,我希望在psql脚本中具有以下道德等价物: 关键是,除非之前设置过,否则末尾的'\set'命令实际上不会设置为\u ERROR\u STOP。我认为在单个psql会话中不可能做到这一点。根据,可以单独使用\set命令列出所有psql变量 可以在shell中记住设置,但这会使整个过程变得毫无用处,因为执行所需的查询集强制执行所需的ON_ERROR_STOP值要简单得多 另一种方法是编写一个匿名代码块,并执行
关键是,除非之前设置过,否则末尾的'\set'命令实际上不会设置为\u ERROR\u STOP。我认为在单个psql会话中不可能做到这一点。根据,可以单独使用\set命令列出所有psql变量 可以在shell中记住设置,但这会使整个过程变得毫无用处,因为执行所需的查询集强制执行所需的ON_ERROR_STOP值要简单得多 另一种方法是编写一个匿名代码块,并执行一些额外的逻辑来检测在添加列之前是否需要删除该列 顺便问一下,直接在后面添加和删除列的目的是什么 如果只是为了确保不存在这样的列,那么该块如何: 做$$ 开始 如果不存在 从信息_schema.columns中选择1 其中表\u schema='public'和表\u name='foo' 和列_name='bar' 然后 执行格式'ALTER TABLE%I.%I ADD%I text', "公众","富","酒吧",; 如果结束; 完(元);
如果您经常进行此类检查,也可以创建一个函数。我想避免ADD列上只存在列已存在的错误,但是将此命令与\unset-\set对括起来会使每个非致命错误都静音,这太多了。我发布的方法更选择性地避免了专栏中已经存在的错误。它并不完美:它依赖于一个隐含的假设,即删除列行要么成功,要么由于列不存在错误而失败,或者由于一个可能导致添加列失败的条件而失败。。。。。。几乎可以肯定,这些案例并没有涵盖所有的可能性,但它们涵盖了到目前为止我的代码将面临的最常见的情况。
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;