首页 > 解决方案 > 如何取消设置(删除,而不是重置)自定义配置参数?

问题描述

set_config用来在会话上设置一些上下文(即用户上下文)。

一旦我为参数设置了上下文 - 我似乎无法摆脱它。RESET/SET param TO DEFAULT将清空该值,但不会完全删除它。

select current_setting('my.test1'); -- SQL Error [42704]: ERROR: unrecognized configuration parameter "my.test1"

select set_config('my.test1','123',false);

select current_setting('my.test1'); -- returns 123

set my.test1 to default;  --same as reset my.test1

select current_setting('my.test1'); --returns an empty string rather than an exception

如何删除它(再次引发异常)?我正在捕捉 42704 但如果我只是“重置”它就不会被抛出。

ps 我认为pg_reload_conf可能会有所帮助 - 但对于这个简单的任务来说似乎过于激进。

谢谢。

标签: postgresql

解决方案


答案是你不能(在 postgres 10 中),如果你在同一个会话中。

只有当您退出会话并打开新会话时,这些空参数才会消失。pg_reload_conf() 对会话中设置的自定义变量或事务本地的自定义变量没有影响,并且无法删除参数。他们只是保持为 '' ... 空字符串。

对我来说,这是一个非常合理的问题和问题......

我一直在使用自定义(即 name_one.name_two )配置参数发现相同的行为,而我一直在开发配置设置包装器以覆盖到单个模式中。

一旦在本地设置了参数,例如set_config ( _name_ , _value_ , TRUE )OR 在会话级别使用set_config ( _name_ , _value_ , FALSE)... 如果设置为 NULL 或 UNSET 或 DEFAULT 则不会被删除 ...在测试和测试并质疑我的之后,我发现没有办法解决这个问题自己对我的稍微嵌套的函数和范围界定的看法......所以我唯一的答案是将我的纯 SQL 语言函数之一更改为 PLPGSQL 并对我所依赖的特定参数进行测试,因为我的允许missing_ok的调用:current_setting ( '_pre._global_int_' , TRUE )如果在会话中任何事务的早期某个时间点已在本地设置或未在本地设置,则不返回NULL!

这也让我很沮丧,我很高兴发现这个问题已经被问到了,所以我在这里给出答案:

它不能在 PG 10 的同一会话中完成

(我还没有在 11 或 12 或 13 尝试过)

更新: 我刚刚找到了这个答案,https ://stackoverflow.com/a/50929568/14653862,来自 Laurenz Albe,它还说在同一个会话中你不能


推荐阅读