【发布时间】:2019-01-24 08:54:55
【问题描述】:
对于其他类型的对象,授予 PUBLIC 的默认权限如下: 数据库的 CONNECT 和 TEMPORARY(创建临时表)权限;函数的 EXECUTE 特权;语言和数据类型(包括域)的 USAGE 权限。
我执行:
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;
test_user下:
alter default privileges in schema s grant execute on functions to test_role;
create function s.x() returns void as $$begin null; end;$$ language plpgsql;
瞧!除了在x() 上为test_role 执行之外,我还为公共执行了!
我的数据库报告version():
PostgreSQL 10.3 (Ubuntu 10.3-1.pgdg14.04+1) on x86_64-pc-linux-gnu,
compiled by gcc (Ubuntu 4.8.4-2ubuntu1~14.04.4) 4.8.4, 64-bit
我的数据库有问题吗?我在另一个数据库(相同的version())上对其进行了测试,得到了相同的结果。
【问题讨论】:
-
我无法重现。请说明您是如何确定
PUBLIC在s.f()上没有EXECUTE权限的。 -
@LaurenzAlbe 最初我在 pgAdmin 生成的反向对象定义中查看它,另外我使用来自这个问题的
pg_functions_grants之类的查询验证了这一点:stackoverflow.com/questions/51850833/… 两种方法都显示相同:f()确实除了所有者之外没有任何特权,并且x()已将 X 授予test_role和 PUBLIC。 -
SELECT has_function_privilege('laurenz', 's.f()', 'EXECUTE');给了我TRUE。SELECT dp.defaclrole::regrole, dp.defaclnamespace::regnamespace, dp.defaclobjtype, acl.grantor::regrole, acl.grantee::regrole, acl.privilege_type FROM pg_default_acl AS dp CROSS JOIN LATERAL aclexplode(dp.defaclacl) AS acl;得到什么? -
另外,您能否展示您用来确定
PUBLIC不能EXECUTE的确切 语句及其结果? -
所以这是一个误会。很好。
标签: postgresql database-administration grant postgresql-10