【发布时间】: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