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