25

我正在尝试与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但这似乎不适用于本地设置。

4

2 回答 2

28

9.6 及更新版本:

PostgreSQL (9.6+) 支持current_setting('setting_name', 't')获取设置并在未设置时返回NULL。您可以将其与coalesce提供默认值结合使用。

9.5 及以上版本:

根据问题,如果您不介意性能下降和笨拙,您可以plpgsql使用使用处理程序的函数来完成。BEGIN ... EXCEPTION但是没有内置支持。

于 2013-07-31T03:06:37.220 回答
1

请找到我在使用 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();
于 2021-07-09T13:26:23.400 回答