PostgreSQL中触发器绑定函数如何将schema名作为变量传入使用
PostgreSQL触发器函数动态使用schema变量的实现方案
你需要使用plpgsql的动态SQL语法EXECUTE结合标识符转义来实现需求,原写法的直接变量占位符在SQL标识符(schema名、表名位置)不生效,必须动态拼接语句后执行。
修改后的完整函数代码
CREATE OR REPLACE FUNCTION test() RETURNS TRIGGER AS $shp_create$ BEGIN RAISE NOTICE 'NEW: %', NEW; IF NEW.log_type = false THEN -- 动态拼接schema名,%I为标识符占位符,自动处理转义避免SQL注入 EXECUTE format( 'INSERT INTO target_table SELECT * FROM %I.start_table', NEW.schema_or ); NEW.log_type := true; RETURN NEW; END IF; RETURN NEW; END; $shp_create$ LANGUAGE plpgsql;
关键说明
- 修复了原函数中函数体首尾标签不匹配的问题:开头用了
$shp_create$,原结尾错误写为$test$,修改后保持首尾一致 - 必须使用
format()函数的%I占位符处理schema名这类标识符,不要直接用字符串拼接,避免出现SQL注入风险,也能兼容带特殊字符的schema名称 - 若
target_table和start_table的字段顺序、字段类型不完全匹配,建议显式写清楚插入字段和查询字段,不要用*匹配,避免表结构变更后触发错误 - 原有触发器定义无需修改,保持原有逻辑即可正常运行
内容的提问来源于stack exchange,提问作者franco_b
相关产品推荐
相关产品推荐

