PostgreSQL在SQL函数内执行ALTER SCHEMA报schema不存在错误如何解决
错误原因
PL/pgSQL 中的静态 SQL 语句不会自动解析替换变量值,你代码中 ALTER SCHEMA schemaname OWNER TO postgresql; 里的 schemaname 被 PostgreSQL 直接识别为 schema 的名称字面量,而非你定义的函数参数变量,因此执行时会尝试查找名为 schemaname 的 schema,最终触发不存在的报错。
解决方法
使用 PL/pgSQL 提供的动态 SQL 语法 EXECUTE 拼接执行语句,同时搭配 format 函数的 %I 占位符处理标识符,既可以正确读取参数值,也能规避 SQL 注入风险。
另外原函数声明返回 text 类型但缺少返回语句,修改后完整代码如下:
CREATE OR REPLACE FUNCTION test.update_ownership(schemaname text) RETURNS text AS $$ DECLARE BEGIN EXECUTE format('ALTER SCHEMA %I OWNER TO postgresql', schemaname); RETURN 'Schema ' || schemaname || ' ownership updated successfully'; END; $$ LANGUAGE plpgsql;
修改后依然使用原有语句调用即可:
select test.update_ownership('myschema');
内容的提问来源于stack exchange,提问作者Anmol
相关产品推荐
相关产品推荐

