首页 > 解决方案 > 所有者是否可能没有表特权?

问题描述

我们一直在尝试在其中一个数据库中创建许多角色和用户。有一次我遇到了这个问题,我发现它很难重现。

它在数据库中是可重现的,但是当我创建一个新数据库并尝试相同时,它不会发生:(

ALTER TABLE public.table_name OWNER TO role_name;

通常,在我们运行此查询之后。table_name将由角色/用户owned决定。role_name

运行上述查询后,如果我们运行以下查询:

select grantee, table_catalog, privilege_type, table_schema, table_name 
from information_schema.table_privileges 
where table_name = 'table_name' 
order by grantee, table_schema, table_name

我们将得到以下结果:

 role_name   | database_name   | INSERT       | public   | table_name
 role_name   | database_name   | DELETE       | public   | table_name
 role_name   | database_name   | SELECT       | public   | table_name
 role_name   | database_name   | UPDATE       | public   | table_name
 role_name   | database_name   | TRUNCATE     | public   | table_name
 role_name   | database_name   | REFERENCES   | public   | table_name
 role_name   | database_name   | TRIGGER      | public   | table_name

然而,在一个特别糟糕的数据库中(我对语言感到抱歉,但上帝知道我经历了什么,我相信这次他会原谅我:P)在我授予所有权后,新角色正在成为所有者,但它对此没有SELECT, INSERT任何特权或任何特权。

所以,我的问题是:

是否有任何场景,当我们将表的所有权分配给角色时,角色可以是所有者,但仍然没有选择、插入、更新、删除权限?

如果是,何时以及为什么?

标签: sqlpostgresqlprivilegespostgresql-13

解决方案


角色可以是所有者,但仍然没有选择、插入、更新、删除权限?

是的。 手册:

对象的所有者可以选择撤销他们自己的普通权限,例如使表对自己和其他人都是只读的。但是所有者始终被视为持有所有授予选项,因此他们始终可以重新授予自己的权限。

超级用户可以做所有者可以做的任何事情。

棘手的细节:所有者(或超级用户)可以REVOKE从他自己(所有者)那里获得特权。如果所有权随后易手,新所有者将继承前所有者拥有的一组特权- 加上新所有者可能已经拥有的任何特权。所以联合了以前角色的权限和所有者的权限。这些就是所有者的新特权。

如果所有权再次易手,则整个特权将被传递!先前的所有者失去了他直接拥有的所有特权。

但是任何角色都可以通过其他角色的成员资格或特权来继承额外的PUBLIC特权。

密切相关:


推荐阅读