Postgres将db所有者的GRANT ROLE改为其他用户没有做到的预期。我错过了什么?

时间:2018-03-13 18:54:19

标签: postgresql permissions grant

我在这里有点困惑。使用第9.6页

CREATE USER user1;
CREATE DATABASE mydb with OWNER user1;
CREATE TABLE x ...;
CREATE USER user2; 
GRANT user1 to user2;

user2登录。

INSERT INTO TABLE x ...;
CREATE TABLE z ...;

一切都很顺利。

user1(数据库所有者)登录。

SELECT FROM z; -- fails; table is owned by user2

db所有者是否不能访问所有对象?

另外,如果我:

CREATE USER user3;
GRANT user1 /* db owner */ TO user3;

即使user2已从数据库所有者授予角色,我也无法访问user3创建的对象。

2 个答案:

答案 0 :(得分:1)

数据库的权限与数据库中其他对象的权限无关,因此即使您是数据库所有者,也可以拒绝访问数据库对象。

数据库的所有权意味着您拥有数据库对象本身的所有权限,并可以将其授予其他人:CREATE到数据库,TEMPORARY模式和ALTER表。此外,您可以DROPALTER数据库。

如果您将数据库所有者授予其他用户,则该用户将获得数据库所有者的所有权限,但不能获得DROPSET ROLE数据库的权限(除非{{1}}是曾经“成为”数据库所有者)。

答案 1 :(得分:1)

GRANT有两种形式:授予数据库对象和授予角色,它们完全不同:

9.1 docs for GRANT

语法部分的最后一行是您正在尝试的GRANT。请注意,授权位于角色上,而不是用户,但在PostgreSQL中,角色是用户:

  

"角色可以被视为数据库用户或一组   数据库用户,取决于角色的设置方式"。

roles - 9.1 docs

此服务器故障链接可能会有所帮助: postgresql-what-does-grant-all-privileges-on-database-do