首页 > 解决方案 > 在 SQL 函数中运行 ALTER 语句时出现错误

问题描述

我写了一个 SQL 函数来改变 SCHEMA 所有权。我可以直接运行该语句(没有函数),但在函数内运行 ALTER 语句时出错。

函数“test”创建成功:

CREATE OR REPLACE FUNCTION test.update_ownership(schemaname text) RETURNS text AS $$ 
DECLARE
        BEGIN
        ALTER SCHEMA schemaname OWNER TO postgresql;
        END;
$$ LANGUAGE plpgsql;

执行函数如下:

选择 test.update_ownership('myschema')

执行函数时出现错误,即:

错误:模式“schemaname”不存在

上下文:SQL 语句“ALTER SCHEMA schemaname OWNER TO postgresql”PL/pgSQL 函数 collection.update_ownership(text) 第 4 行在 SQL 语句 SQL 状态:3F000

标签: sqlpostgresqlplpgsqldynamic-sqlddl

解决方案


您不能将参数用作标识符,您必须为此使用动态 SQL。生成 SQL 最好使用format()正确处理标识符的函数来完成。

CREATE OR REPLACE FUNCTION test.update_ownership(schemaname text) 
   RETURNS void 
AS $$ 
BEGIN
  execute format('ALTER SCHEMA %I OWNER TO postgresql', schemaname);
END;
$$ LANGUAGE plpgsql;

推荐阅读