Postgresql 为什么Postgres不按照文件规定向公众授予EXECUTE on功能?

Postgresql 为什么Postgres不按照文件规定向公众授予EXECUTE on功能?,postgresql,database-administration,grant,postgresql-10,Postgresql,Database Administration,Grant,Postgresql 10,说: 对于其他类型的对象,授予PUBLIC的默认权限如下:连接和临时创建数据库的临时表权限;对功能执行权限;以及语言和数据类型(包括域)的使用权限 我执行: create user test_user password 'test_user'; grant create on database "NLP" to test_user; 然后我在该用户下连接并执行以下操作: create schema s; create function s.f() returns void as $$begin

说:

对于其他类型的对象,授予PUBLIC的默认权限如下:连接和临时创建数据库的临时表权限;对功能执行权限;以及语言和数据类型(包括域)的使用权限

我执行:

create user test_user password 'test_user';
grant create on database "NLP" to test_user;
然后我在该用户下连接并执行以下操作:

create schema s;
create function s.f() returns void as $$begin null; end;$$ language plpgsql;
我希望函数上的EXECUTE将被授予PUBLIC,但这不会发生。为什么?

此外,我还发现了一件奇怪的事情。如果我更改模式的默认函数权限,该机制将开始工作

create role test_role;
在测试用户下:

瞧!除了在x上执行test_角色外,我还得到了公共执行

我的数据库报告版本:


我的数据库有问题吗?我在同一版本的另一个数据库上测试了它,得到了相同的结果。

回答了我自己的问题。一切正常,但我误解了pgAdmin的指示

select proacl from pg_proc where proname = 'f'
给出空值,根据:

如果给定对象的“访问权限”列为空,则表示该对象具有默认权限,即其“权限”列为空。默认权限始终包括所有者的所有权限,并且可以根据对象类型包括PUBLIC的某些权限,如上所述

对于像function这样的对象类型,它假设executeforpublic,正如我在最初的问题中发布的那个样

感谢Laurenz,还可以方便地测试用户的有效权限:

select has_function_privilege('username', 's.f()', 'EXECUTE');
这对任何用户都是正确的


pgAdming在一个案例中为公众生成了明确的授权,而在另一个案例中却没有生成任何授权,这一事实具有误导性。不授予PUBLIC并不一定意味着PUBLIC没有权限。

我无法复制此信息。请说明您是如何确定PUBLIC对s.f.@LaurenzAlbe没有执行权限的。最初,我在pgAdmin生成的反向对象定义中查看了它,此外,我还使用类似于PGU函数的查询验证了这一点。这两种方法显示相同:f除了所有者的权限之外,没有任何权限,x授予x测试角色和公共。SELECT具有“laurenz”、“s.f”、“EXECUTE”权限;这是真的。从pg中选择dp.defaclrole::regrole,dp.defaclnamespace::regnamespace,dp.defaclobjtype,acl.Defensor::regrole,acl.grantee::regrole,acl.privilege_type作为dp交叉连接横向aclexplodedp.defaclacl作为acl;,您会得到什么;?另外,你能给出你用来确定公众不能执行的确切陈述及其结果吗?所以这是一个误解。好的
select proacl from pg_proc where proname = 'f'
select has_function_privilege('username', 's.f()', 'EXECUTE');