是否可以在postgresql中定义全局变量

Nur*_*mir 6 postgresql global-variables postgresql-9.4

我正在使用postgresql 9.4,在编写函数时我想使用自定义的error_codes(int).但是,我可能希望稍后更改确切的数值.
例如,
-1表示USER_NOT_FOUND.
-2表示USER_DOES_NOT_HAVE_PERMISSION.

我可以在表codes_table(code_name :: text,code_value :: integer)中定义这些,并在函数中使用它们如下

(SELECT codes_table.code_value FROM codes_table WHERE codes_table.code_name = 'USER_NOT_FOUND')
Run Code Online (Sandbox Code Playgroud)

还有另一种方法吗?也许全局变量?

kli*_*lin 7

Postgres 没有全局变量。但是,您可以定义自定义配置参数。为了清楚起见,请使用给定的前缀定义您自己的参数,例如glb

这个简单的函数将使在查询中放置参数变得更容易:

create or replace function glb(code text)
returns integer language sql as $$
    select current_setting('glb.' || code)::integer;
$$;

set glb.user_not_found to -1;
set glb.user_does_not_have_permission to -2;

select glb('user_not_found'), glb('user_does_not_have_permission');
Run Code Online (Sandbox Code Playgroud)

用户定义的参数在会话中是本地的,因此应该在每个会话开始时定义参数。


Nic*_*nes 5

@klin的答案为基础,有两种方法可以将配置参数保留在当前会话之后。请注意,这些需要超级用户特权。

为与特定数据库的所有连接设置值:

ALTER DATABASE db SET abc.xyz = 1;
Run Code Online (Sandbox Code Playgroud)

您还可以使用ALTER SYSTEM9.4中添加的命令来设置服务器范围的值。如果用户定义的参数已经SET在您当前的会话中,它似乎仅适用于它们。还请注意,这需要重新配置配置才能生效。

SET abc.xyz = 1;
ALTER SYSTEM SET abc.xyz = 1;
SELECT pg_reload_conf();
Run Code Online (Sandbox Code Playgroud)

在9.4之前的版本中,您可以通过将参数添加到服务器postgresql.conf文件中来完成相同的操作。在9.1及更早版本中,您还需要注册一个自定义变量class