【问题标题】:Getting ERROR while running ALTER statement inside the SQL function在 SQL 函数中运行 ALTER 语句时出现错误
【发布时间】:2021-11-09 21:10:46
【问题描述】:

我编写了一个 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 模式名 OWNER TO postgresql” PL/pgSQL 函数 collection.update_ownership(text) 第 4 行 SQL 语句 SQL状态:3F000

【问题讨论】:

  • 您将模式名作为变量传递?在您的代码(和错误)中,它表示您的变量为文本(不使用变量值)。在 MSSQL 中你不能这样做,你需要使用动态 SQL 并且不确定它是否适用于 postgressql。
  • 你能用这样的功能创建一个db-fiddle吗?因为我在db-fiddle.com/f/q9jynKQV3euZh9TPoW8GsH/0 上看到“架构错误:错误:在“$$ DECLARE BEGIN ALTER SCHEMA schemaname OWNER TO postgresql;”或附近看到未终止的美元引号字符串
  • @Brad:你绝对可以在 Postgres 的存储函数中使用动态 SQL

标签: sql postgresql plpgsql dynamic-sql ddl


【解决方案1】:

您不能将参数用作标识符,您必须为此使用动态 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多