运行下面的 SQL,我遇到了权限问题。
[42501] 错误:架构 myschema 的权限被拒绝 其中:SQL 语句中的 PL/pgSQL 函数>myschema.test_func(( 第 8 行
我需要授予什么权限才能允许安全定义器选择/执行函数。所有权限似乎都不起作用。
看着 https://www.postgresql.org/docs/current/sql-grant.html 我看不出还有什么可以授予来完成这项工作的。
我正在使用Postgresql 11。显然,如果我使myrole成为超级用户,它可以正常工作。即使将赠款放在最后也会产生相同的错误。
编辑:
我还没有解释得很好。问题不是创建函数,我在调用以下行时遇到问题:SELECT myschema.test_func_2('foo', 'bar') INTO l_table_result;
函数的创建工作正常,只有当我运行select myschema.test_func();
时,我才会收到SQL错误。
我看不到 myrole 需要哪些其他权限才能调用另一个函数。
CREATE ROLE myrole WITH NOLOGIN;
CREATE SCHEMA IF NOT EXISTS myschema;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA myschema TO myrole ;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA myschema TO myrole ;
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA myschema TO myrole ;
CREATE OR REPLACE
FUNCTION myschema.test_func()
RETURNS BOOLEAN
SECURITY DEFINER
LANGUAGE plpgsql
AS $$
DECLARE
l_table_result BOOLEAN;
BEGIN
RAISE LOG 'Will Get This Far ... ';
SELECT myschema.test_func_2('foo', 'bar') INTO l_table_result;
RAISE LOG 'But Not This Far';
RETURN TRUE;
END;
$$;
/* OWNERSHIP AND PERMISSIONS*/
ALTER FUNCTION myschema.test_func OWNER to myrole;
CREATE OR REPLACE
FUNCTION myschema.test_func_2(
p_foo VARCHAR(10),
p_bar VARCHAR(10)
)
RETURNS BOOLEAN
SECURITY DEFINER
LANGUAGE plpgsql
AS $$
BEGIN
RETURN TRUE;
END;
$$;
/* OWNERSHIP AND PERMISSIONS*/
ALTER FUNCTION myschema.test_func_2(VARCHAR, VARCHAR) OWNER to myrole;
select myschema.test_func();
您需要对架构具有CREATE
权限才能在该架构中创建新对象。 因此,GRANT ALL ON SCHEMA myschema to myrole;
授予myrole
创建此函数的权限。此GRANT
的文档也位于您链接的页面上。
无论如何,您刚刚在脚本中创建了此用户,我猜您当时没有与此用户一起连接到数据库,因此您可以在创建函数之前添加SET ROLE myrole;
。你可以在事后杀死ALTER FUNCTION
,即使有时你可能想保留它,这是你的决定。
最后一句话:如果您尝试使用这种SECURITY DEFINER
和ALTER FUNCTION
的组合来获取一个以真正发出CREATE FUNCTION
的用户身份执行的函数(如果您故意不做SET ROLE
,这可能是这样(,这将不起作用。如此处所述,权限是根据拥有函数的用户而不是创建函数的用户进行检查的。
编辑:评论中的答案,这确实解决了(编辑的(问题
尽管创建是可能的(也许只是你通过ALTER FUNCTION
而不是通过用户myrole
CREATE FUNCTION
选择的方式(,并且你可以调用函数,但在函数内部,你充当用户myrole
,函数myschema.test_func_2
的查找由他执行,因此myrole
至少需要模式的USAGE
特权。