我正在尝试使用current_setting()
。
我想出了这个:
CREATE OR REPLACE FUNCTION process_audit() RETURNS TRIGGER AS $audit$
DECLARE
user_id integer;
BEGIN
BEGIN
user_id := current_setting('hws.current_user_id');
EXCEPTION WHEN OTHERS THEN
user_id := NULL;
END;
...
RETURN NULL;
END;
$audit$ LANGUAGE plpgsql;
通过以下方式设置设置:
SELECT set_config('hws.current_user_id', '5', true); -- true = local setting -> only visible in current transaction
问题是,如果值无效,current_setting()
会抛出异常。我不想使用EXCEPTION
,因为我读到异常块很昂贵。
有没有办法检查设置是否有值而不使用例外?
顺便说一句:我也尝试从pg_settings
读取,但这似乎不适用于本地设置。
答案 0 :(得分:17)
PostgreSQL(9.6+)支持current_setting('setting_name', 't')
获取设置,如果未设置则返回NULL
。您可以将其与coalesce
结合使用以提供默认值。
根据这个问题,如果您不介意性能损失和笨拙,可以使用plpgsql
函数使用BEGIN ... EXCEPTION
处理程序。但是没有内置的支持。
答案 1 :(得分:0)
你还应该投演员吗?如下,
user_id := current_setting('hws.current_user_id')::integer;
答案 2 :(得分:0)
请找到我在使用 current_setting 时使用的以下示例。
CREATE OR REPLACE FUNCTION public.usp_fetch_current_setting()
RETURNS text
LANGUAGE plpgsql
AS $function$
declare
v_appCode text;
begin
select current_setting('spm.appCode', 't') into v_appCode;
return v_appCode;
END;
$function$
;
通话时:
set session "spm.appCode" = 'spm-alignment-web';
SELECT public.usp_fetch_current_setting();