我想和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本书,但在当地环境下似乎不起作用.

推荐答案

9.6及更新版本:

PostgreSQL(9.6+)支持current_setting('setting_name', 't')获取设置,如果未设置,则返回NULL.您可以将其与coalesce组合以提供默认值.

9.5及以上:

根据问题,如果你不介意性能的影响和笨拙,你可以用一个使用BEGIN ... EXCEPTION处理程序的plpgsql函数来实现.但是没有内置的支持.

Postgresql相关问答推荐

Redis作为postgreSQL嵌套数据的缓存

处理Ruust-DIESEL中的Jsonb PostgreSQL列

Postgres 函数 now() 返回不正确的时区偏移量

在 postgresql 数据库 timestampz 中保留用户偏移量

订阅标签保存在哪个表中?

如何在 postgresql 上使用 sqlalchemy 进行正确的 upsert?

带有初始数据的 docker postgres 不会在提交中持久化

错误:syntax error at or near "user"

PostgreSQL 提示:You will need to rewrite or cast the expression. column "state" is of type status but expression is of type character varying

如何在 postgres json 列中查询嵌套数组?

在 postgreSQL 中更改序列名称

manage.py 迁移时必须是关系 django_site 的所有者

如何使用 Node.js 和 Postgresql 找到最后一个插入 ID?

是否可以在 CSV 格式的 Postgres COPY 命令中关闭报价处理?

如何使用 WITH RECURSIVE 子句进行 Select

pg_restore 会覆盖现有的表吗?

PostgreSQL - 必须出现在 GROUP BY 子句中或在聚合函数中使用

使用 PostgreSQL 的 Linq To Sql

在 PostgreSQL 中使用 CASE 一次影响多个列

pg_restore 目录错误