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)
还有另一种方法吗?也许全局变量?
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)
用户定义的参数在会话中是本地的,因此应该在每个会话开始时定义参数。
以@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。
| 归档时间: |
|
| 查看次数: |
13653 次 |
| 最近记录: |