Postgresql 在Postgres 13中设置未按预期工作的表的默认权限

Postgresql 在Postgres 13中设置未按预期工作的表的默认权限,postgresql,Postgresql,设置:我正在使用谷歌云平台的托管Postgres 13实例,这是一个新安装,没有现有的表或用户(除了Postgresadmin) 目标:我想创建一个名为my_db的新数据库,让两个新用户steve和mike能够在未来的表上执行DDL和DML命令(例如,创建新表、插入数据、读取等)。这也意味着steve和mike应该能够修改和读/写彼此的表格 问题:即使我在模式公共中创建用户并设置默认权限,也要向my_db中的表授予所有,只有新表的创建者(steve)可以读/写表,而mike不能。此外,即使是po

设置:我正在使用谷歌云平台的托管Postgres 13实例,这是一个新安装,没有现有的表或用户(除了
Postgres
admin)

目标:我想创建一个名为
my_db
的新数据库,让两个新用户
steve
mike
能够在未来的表上执行DDL和DML命令(例如,创建新表、插入数据、读取等)。这也意味着
steve
mike
应该能够修改和读/写彼此的表格

问题:即使我在模式公共中创建用户并设置
默认权限,也要向
my_db
中的表授予所有
,只有新表的创建者(
steve
)可以读/写表,而
mike
不能。此外,即使是
postgres
管理员也无法读取新表

步骤:如何重新创建

  • 首先,我将创建新的数据库和用户,并授予他们在
    myu db
    中更改/读取/写入未来表的宽松权限
  • 如果我的理解正确,
    steve
    mike
    现在可以在
    my_db
    中创建和修改表格。让我们测试一下

  • 然后在新连接中以
    steve
    的身份登录#2并创建一个新的测试表:
  • 现在让我们看看
    mike
    是否可以从
    test\u tbl
    中读取,他应该获得默认权限。我们为
    mike
    创建连接#3:
  • 这是我的第一个困惑点,因为我认为默认权限会让mike阅读由steve创建的
    测试

  • 最后一件奇怪的事是,我决定回到
    postgres
    用户那里测试阅读
    test\tbl
  • 因此,即使管理员用户
    postgres
    也无法读取此新表,我也无法授予权限

  • 唯一有效的方法是以原始表创建者steve的身份重新登录,并授予postgres和mike的权限:
  • 这一切似乎都是倒退。schema public grant all中的
    默认特权应该允许用户修改未来的表,对吗?我错过了什么


    提前感谢。

    alterdefaultprivileges
    如果不使用
    forrole
    子句,则仅影响运行
    alterdefaultprivileges
    语句的角色创建的对象

    你需要两个这样的陈述才能得到你想要的:

    ALTER DEFAULT PRIVILEGES FOR ROLE mike GRANT ... TO steve;
    ALTER DEFAULT PRIVILEGES FOR ROLE steve GRANT ... TO mike;
    
    你想要的另一件东西是不能以严格的方式得到的。只有所有者(或该角色的成员)和超级用户才能
    更改
    删除
    对象。没有办法授予这种特权。您唯一的解决方案是拥有一个通用的
    表\u所有者
    角色,并且两个用户都是该角色的成员:

    CREATE ROLE table_owner NOLOGIN;
    
    GRANT CREATE ON SCHEMA myschema TO table_owner;
    
    ALTER ROLE mike NOINHERIT;
    ALTER ROLE steve NOINHERIT;
    
    GRANT table_owner TO mike, steve;
    
    现在,两个用户都需要
    设置角色
    在架构中创建一个表:

    SET ROLE table_owner;
    
    CREATE TABLE myschema.atable (...);
    

    然后,该表由
    table\u owner
    所有,两个用户都可以
    更改
    删除它。

    我看不到您实际更改用户的位置。
    选择会话用户、当前用户是什么为每个步骤显示?同样在
    psql
    中,
    \dp和\ddp
    为表格显示了什么?你说你“返回postgres用户”,但你没有显示任何可以这样做的命令,错误消息清楚地说你仍然是steve,而不是postgres。@AdrianKlaver-我指的是--user=steve这样的行我使用完全不同的连接(在DBeaver中)切换用户。很有趣。我没有完全理解角色与用户之间的细微差别。我将创建
    table\u owner
    角色,并邀请
    steve
    mike
    加入该角色。谢谢你的回答!
    NOINHERIT
    阻止他们创建表,除非他们运行
    SET角色
    -- Logged in as user = postgres (Connection 1)
    \c my_db
    
    select * from test_tbl; -- ERROR: steve does not have permissions to read test_tbl!
    
    GRANT SELECT, INSERT, UPDATE, delete ON ALL TABLES IN SCHEMA public TO mike; -- same error above!
    
    
    -- Logged in as user = steve (Connection 2)
    \c my_db
    
    GRANT SELECT, INSERT, UPDATE, delete ON ALL TABLES IN SCHEMA public TO postgres; -- success
    GRANT SELECT, INSERT, UPDATE, delete ON ALL TABLES IN SCHEMA public TO mike; -- success
    
    ALTER DEFAULT PRIVILEGES FOR ROLE mike GRANT ... TO steve;
    ALTER DEFAULT PRIVILEGES FOR ROLE steve GRANT ... TO mike;
    
    CREATE ROLE table_owner NOLOGIN;
    
    GRANT CREATE ON SCHEMA myschema TO table_owner;
    
    ALTER ROLE mike NOINHERIT;
    ALTER ROLE steve NOINHERIT;
    
    GRANT table_owner TO mike, steve;
    
    SET ROLE table_owner;
    
    CREATE TABLE myschema.atable (...);