使用安全定义器调用函数时权限被拒绝,即使在运行 GRANT ALL 到角色之后也是如此



运行下面的 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 DEFINERALTER FUNCTION的组合来获取一个以真正发出CREATE FUNCTION的用户身份执行的函数(如果您故意不做SET ROLE,这可能是这样(,这将不起作用。如此处所述,权限是根据拥有函数的用户而不是创建函数的用户进行检查的。

编辑:评论中的答案,这确实解决了(编辑的(问题

尽管创建是可能的(也许只是你通过ALTER FUNCTION而不是通过用户myroleCREATE FUNCTION选择的方式(,并且你可以调用函数,但在函数内部,你充当用户myrole,函数myschema.test_func_2的查找由他执行,因此myrole至少需要模式的USAGE特权。

相关内容

最新更新