我在这里有点困惑。使用第 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
表。此外,您可以ALTER
和DROP
数据库。
授予其他用户,则该用户将获得数据库所有者的所有权限,但不会获得ALTER
或DROP
数据库的权限(除非SET ROLE
用于"成为"数据库所有者(。