PostgreSQL 11中基于特定IP创建触发器与函数的语法错误排查
问题解决方法
核心原因
在PostgreSQL的DO块中嵌套创建PL/pgSQL函数时,若函数体未用**美元引号($$)**正确包裹,DO块会将函数内部的DECLARE语句误认为是自身的PL/pgSQL代码,从而触发语法错误。
修复步骤
在DO块内创建函数时,必须用美元引号包裹函数的完整PL/pgSQL代码块,避免字符串边界冲突。示例代码结构如下:
DO $$ BEGIN -- 检查当前服务器IP IF current_setting('inet_server_addr') IN ('10.11.11.11', '10.22.22.22') THEN -- 创建触发器函数 CREATE OR REPLACE FUNCTION my_trigger_function() RETURNS TRIGGER AS $$ DECLARE -- 此处为函数内部的变量声明,不会触发语法错误 example_var VARCHAR(50); BEGIN -- 函数业务逻辑 RETURN NEW; END; $$ LANGUAGE plpgsql; -- 创建触发器 CREATE TRIGGER my_table_trigger AFTER INSERT ON target_table FOR EACH ROW EXECUTE FUNCTION my_trigger_function(); END IF; END $$;
注意:函数体的美元引号可以自定义标记(如$func$),只要和DO块的外层引号不重复即可,避免嵌套冲突。
代码存储分享平台推荐
- Gist:轻量代码片段存储工具,支持语法高亮,生成永久/临时分享链接,无需注册即可查看内容,注册后可管理自己的代码片段。
- GitHub Gists:与GitHub账号绑定,支持版本控制、多人协作编辑,适合开发者长期存储和分享代码片段。
- Pastebin:操作简单的代码粘贴平台,可设置内容过期时间,生成短链接,支持多种编程语言高亮。
- CodePen:主打前端代码分享,支持实时预览效果,也可存储后端代码,适合展示可运行的代码示例。
内容的提问来源于stack exchange,提问作者Gerzzog
相关产品推荐
相关产品推荐

