请注意,如果您使用数据库级别的设置,例如@nick-barnes的
答案中所述,当用户连接到该数据库时,这些设置将被设置为会话
默认值,但可以在该会话(或事务)中覆盖。
如果您希望强制执行数据库设置,可以直接访问
pg_db_role_setting
系统目录,就像我
pg_safer_settings
扩展中的此函数所做的那样(在此处复制并获得了我的明确许可)。
create function pg_db_setting(pg_setting_name$ text, pg_role$ regrole = 0)
returns text
stable
return (
select
regexp_replace(expanded_settings.raw_setting, E'^[^=]+=', '')
from
pg_catalog.pg_db_role_setting
inner join
pg_catalog.pg_database
on pg_database.oid = pg_db_role_setting.setdatabase
cross join lateral
unnest(pg_db_role_setting.setconfig) as expanded_settings(raw_setting)
where
pg_database.datname = current_database()
and pg_db_role_setting.setrole = coalesce(
pg_role$,
0
)
and expanded_settings.raw_setting like pg_setting_name$ || '=%'
limit 1
);
这里有一个例子来阐述
pg_catalog.current_setting()
函数和我的
pg_db_role_setting()
函数语义上的差异:
CREATE DATABASE mydb;
CONNECT TO mydb
CREATE ROLE myrole;
ALTER DATABASE mydb
SET app.settings.bla = 1::text;
ALTER ROLE myrole
IN DATABASE mydb
SET app.settings.bla = 2::text;
SET ROLE myrole;
SET app.settings.bla TO 3::text;
SELECT current_setting('app.settings.bla', true);
SELECT pg_db_role_setting('app.settings.bla');
SELECT pg_db_role_setting('app.settings.bla', current_user);
另一种常见的模式是将设置存储为不可变的函数或表格。如果您将它们存储在表中,请帮我一个忙,并将它们存储为列,而不是行。我的
pg_safer_settings
扩展功能包括一个
pg_safer_settings_table
,它结合了这两种范例,允许您将设置存储为列,并自动维护每个列的
current_<col_name>()
函数。(
current_
前缀可配置。)
RAISE EXCEPTION
返回错误代码,并且较新版本允许您指定要引发的代码。 - Jasen