Postgres 将数据库所有者的角色授予其他用户,而不是执行预期操作.我错过了什么



我在这里有点困惑。使用第 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

数据库所有者不应该有权访问所有对象吗?

另外,如果我:

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

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

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

9.1 格兰特文档

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

"一个角色可以被认为是一个数据库用户,或者一组 数据库用户,具体取决于角色的设置方式"。

角色 - 9.1 文档

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

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

数据库

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

如果将数据库所有者

授予其他用户,则该用户将获得数据库所有者的所有权限,但不会获得ALTERDROP数据库的权限(除非SET ROLE用于"成为"数据库所有者(。