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
相关产品推荐
相关产品推荐

