在连接中传递附加数据以供 PGSQL 触发器使用

And*_*rew 6 postgresql trigger

我想向 PG 添加一些审计触发器,以记录对表的所有更改。我找到了一个示例触发器(wiki.postgresql.com - 9.1+ 审计触发器),它让我开始了。

我想要做的是自动传递一些附加数据,例如 theuser-id或 other 键,以便触发器可以将更改链接回进行更改的应用程序用户。基本流程如下:

  • 获取当前请求的连接
  • 运行自定义 SQL 以设置上下文变量 ( set conn_context = {userid};)
  • 读取/解析触发器内的变量
  • 将值与其他信息一起写入日志表

使用 MS SQL 时,我能够通过执行SET CONTEXT_INFO ...data.... 我希望有一种方法可以为 PG 做到这一点;我还没有找到,但这可能是糟糕的 google-fu。

And*_*rew 1

老问题,但仍然有效,所以这就是我最终使用的。

9.6 及更高版本上,要设置以下任一值都可以:

  • select set_config('app.userid', '3', true)
  • SET LOCAL "app.userid" = 3;(或者'3'

读出值(Postgres > 9.6)

对于任何远程现代 postgres,您可以读取该值并返回null(如果未设置)。感谢@motcke 在评论中提供更新。

-- pass `true` to return null if missing (see original answer)
userid := current_setting('app.user_id', true) 
Run Code Online (Sandbox Code Playgroud)

原始答案,对于(Postgres <= 9.5)

我最终将用户 ID 或其他字段的查找包装在函数中,以处理类型转换以及它可能未设置的事实:

对于版本<= 9.5(正如所关注的问题):

CREATE OR REPLACE FUNCTION app_get_userid() RETURNS INT AS $$
DECLARE userid integer;
BEGIN
    BEGIN
        userid := current_setting('app.userid');
    EXCEPTION
        WHEN OTHERS THEN userid := NULL;
    END;
    return userid;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)