postgreSQL:如何使用ROLE允许完全访问给定角色的所有用户(例如,在访问表之前不使用SET ROLE)

我要使用具有SQL Server背景的postgreSQL,并且天真地将相同的概念应用于postgreSQL,以允许不同的用户“默认”共享数据库中的某些对象。

这就是我所做的:

CREATE DATABASE testdb;
CREATE ROLE testdb_role_full INHERIT;
GRANT ALL PRIVILEGES ON DATABASE testdb TO testdb_role_full;

CREATE USER user1 INHERIT; 
GRANT testdb_role_full TO user1;

CREATE USER user2 INHERIT; 
GRANT testdb_role_full TO user2;

完成后,我使用user1创建了一个表t1。 然后,我以user2身份尝试读取t1表,并收到“权限被拒绝错误” ...:-(

通过阅读文档,看来我必须先发出SET ROLE testdb_role_full才能充当testdb_role_full。

但是,这并不是我真正想要的。我不希望用户意识到这一点。

所以我的问题:

有什么办法可以使这项工作成功吗?

非常感谢, 乔斯

dengbaoan1989 回答:postgreSQL:如何使用ROLE允许完全访问给定角色的所有用户(例如,在访问表之前不使用SET ROLE)

您已授予数据库某些特权,但这并不意味着任何具有testdb_role_full角色的用户都将对该数据库内的所有对象拥有所有特权。引用the documentation

  

创建对象后,将为其分配一个所有者。所有者通常是执行创建语句的角色。对于大多数对象,初始状态是只有所有者(或超级用户)才能对对象执行任何操作。要允许其他角色使用它,必须授予特权。

因此,user1创建了表t1之后,他是所有者,只有他对此具有特权。他需要跑步

GRANT ALL PRIVILEGES ON TABLE t1 TO testdb_role_full;

然后user2也将能够访问它(无需切换任何角色-仅当它在角色上具有NOINHERIT属性时才需要)。


如果您不希望用户每次在数据库中创建新对象时都必须执行GRANT,则可以alter the default privileges应用于{{ 1}}:

user2

请注意,这些仅指定初始值,如果ALTER DEFAULT PRIVILEGES FOR user2 GRANT ALL PRIVILEGES ON TABLES TO testdb_role_full; 要阻止其他人看到它们,则user2可以撤消其表上的特权。

本文链接:https://www.f2er.com/3141416.html

大家都在问