You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL触发器函数中current_setting赋值整型变量报错问题

问题原因
  • 核心是你对current_setting函数的返回值认知有误:PostgreSQL中当你给current_setting的第二个参数missing_ok传入true时,如果指定的配置项不存在,返回的是空字符串'',不是null。
  • 你声明的log_user_id是int类型,空字符串无法隐式转换为整数,就触发了你看到的invalid input syntax for integer: ""报错,该问题和触发器执行环境无关,只要做这个类型转换的场景都会报错。
  • 额外优化点:你执行的静态SQL完全不需要用EXECUTE动态执行,不仅没有必要,还增加了引号转义的复杂度和执行开销。
解决方案

直接修改赋值逻辑,用nullif函数把空字符串转为null后再强转为整数即可,修改后的代码如下:

CREATE OR REPLACE FUNCTION update_log() RETURNS TRIGGER AS $update_log$
DECLARE
    logid int;
    log_user_id int;
BEGIN
    -- 替换原有的EXECUTE行,无需动态执行
    log_user_id := nullif(current_setting('myvars.active_user_id', true), '')::integer;

    IF (TG_OP='DELETE') THEN
        logid := nextval('seq_log');
        -- INSERT INTO log ....
        RETURN NULL;
    ELSIF (TG_OP='INSERT') THEN
        logid := nextval('seq_log');
        -- INSERT INTO log ....
        RETURN NEW;
    ELSIF (TG_OP='UPDATE') THEN
        -- INSERT INTO log ....
        RETURN NEW; -- UPDATE触发器需要返回NEW才会使更新生效
    END IF;
    RETURN NULL; 
END;
$update_log$ LANGUAGE plpgsql;

额外说明:你的原代码存在多余的END IF语法错误,上述代码已经做了基础修正。

内容的提问来源于stack exchange,提问作者springcorn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 14:06:04