为什么Postgres不按记录授予PUBLIC函数执行权?

时间:2018-08-17 10:20:09

标签: postgresql database-administration grant postgresql-10

Documentation说:

  

对于其他类型的对象,授予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;

Voila!除了x()test_role上执行,我还对PUBLIC执行了!

我的数据库报告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())上对其进行了测试,并得到了相同的结果。

1 个答案:

答案 0 :(得分:1)

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

select proacl from pg_proc where proname = 'f'

给予NULL,根据documentation

  

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

对于函数这样的对象类型,它假定对PUBLIC执行(如我在最初的问题中所述)。

(感谢Laurenz)也可以方便地测试用户的有效权限:

select has_function_privilege('username', 's.f()', 'EXECUTE');

为任何用户提供了TRUE

在一种情况下pgAdming为PUBLIC产生了明确的授权,而在另一种情况下则没有产生任何事实,这具有误导性。缺少对PUBLIC的授予并不一定意味着PUBLIC没有权限。