所有者可能没有 table 权限吗?
Is it possible for an owner to not have table-privileges?
我们一直在尝试在其中一个数据库中创建许多角色和用户。有一次我遇到了这个问题,我发现它很难重现。
它可以在数据库中重现,但是当我创建一个新数据库并尝试相同的操作时,它并没有发生:(
ALTER TABLE public.table_name OWNER TO role_name;
通常,在我们运行这个查询之后。 table_name
将由 role_name
role/user 变为 owned
。
在 运行 上面的查询之后,如果我们 运行 下面的查询:
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
或与此相关的任何特权。
那么,我的问题是:
是否存在这样的情况:当我们将 table 的所有权分配给角色时,该角色可以是所有者但仍然没有 select、插入、更新、删除特权?
如果是,什么时候,为什么?
the role can be the owner and still not have select, insert, update, delete privilege?
是。 The manual:
An object's owner can choose to revoke their own ordinary privileges,
for example to make a table read-only for themselves as well as
others. But owners are always treated as holding all grant options, so
they can always re-grant their own privileges.
超级用户可以做所有者可以做的任何事情。
棘手的细节:所有者(或超级用户)可以从他自己(所有者)那里获得 REVOKE
特权。如果所有权随后易手,新所有者将继承前任所有者拥有的一组特权 - 加上新所有者可能已经拥有的任何特权。所以union之前角色的权限和所有者的权限。这些就是 owner.
的新特权
如果所有权再次易手,则所有特权都将被传递!原拥有者将失去他直接拥有的所有特权。
但是任何角色都可以通过另一个角色的成员身份或通过 PUBLIC
特权继承额外的特权。
密切相关:
我们一直在尝试在其中一个数据库中创建许多角色和用户。有一次我遇到了这个问题,我发现它很难重现。
它可以在数据库中重现,但是当我创建一个新数据库并尝试相同的操作时,它并没有发生:(
ALTER TABLE public.table_name OWNER TO role_name;
通常,在我们运行这个查询之后。 table_name
将由 role_name
role/user 变为 owned
。
在 运行 上面的查询之后,如果我们 运行 下面的查询:
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
或与此相关的任何特权。
那么,我的问题是:
是否存在这样的情况:当我们将 table 的所有权分配给角色时,该角色可以是所有者但仍然没有 select、插入、更新、删除特权?
如果是,什么时候,为什么?
the role can be the owner and still not have select, insert, update, delete privilege?
是。 The manual:
An object's owner can choose to revoke their own ordinary privileges, for example to make a table read-only for themselves as well as others. But owners are always treated as holding all grant options, so they can always re-grant their own privileges.
超级用户可以做所有者可以做的任何事情。
棘手的细节:所有者(或超级用户)可以从他自己(所有者)那里获得 REVOKE
特权。如果所有权随后易手,新所有者将继承前任所有者拥有的一组特权 - 加上新所有者可能已经拥有的任何特权。所以union之前角色的权限和所有者的权限。这些就是 owner.
如果所有权再次易手,则所有特权都将被传递!原拥有者将失去他直接拥有的所有特权。
但是任何角色都可以通过另一个角色的成员身份或通过 PUBLIC
特权继承额外的特权。
密切相关: