我拥有具有CREATEROLE权限的用户‘管理员’.我创建新用户的方式如下:

CREATE USER test_user;

然后我将权限授予新用户:

GRANT administrator TO test_user;

当我以管理员身份登录时,我可以毫不费力地创建用户,因为管理员有这样做的特权.但是由于某些原因,‘test_user’不能创建用户.当我try 它时,我得到以下输出:

ERROR:  permission denied to create role

\dU的输出:

List of roles
   Role name   |                         Attributes                         |    Member of    
---------------+------------------------------------------------------------+-----------------
 administrator | Create role                                                | {}
 analyst       |                                                            | {}
 manager       |                                                            | {}
 postgres      | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 test_user     |                                                            | {administrator}

推荐答案

如果是关于继承的,\du会显示No inheritance属性.我认为这实际上可能是因为 CREATEROLE是集群范围内的role attribute,必须显式给出,并且不受继承的限制.

role creation个 必须明确授予角色权限才能创建更多角色(超级用户除外,因为超级用户绕过了所有权限判断).要创建这样的角色,请使用CREATE ROLE name CREATEROLE.

所以,你不能指望test_user也有administrator个角色,不管inherit在任何级别上的设置.您需要显式且独立地设置该属性,方法与最初必须为administrator设置属性的方式相同:

CREATE USER test_user CREATEROLE;

CREATE USER test_user;
ALTER ROLE test_user WITH CREATEROLE;

除非您不介意手动升级到administrator到 无论何时,作为test_user,您需要执行某项操作时,只有administrator角色具有足够的权限/属性.要做到这一点,GRANT administrator TO test_user;就足够了.


如果它是实际的role privilege个继承,而不是少数不可继承的role attributes,下面是role memberships如何处理这些继承的:

组角色的成员可以通过两种方式使用该角色的权限.首先,已被授予具有SET选项的成员身份的成员角色可以执行SET ROLE操作以临时"成为"组角色.在这种状态下,数据库会话可以访问组角色的权限,而不是原始登录角色的权限,并且创建的任何数据库对象都被视为由组角色而不是登录角色拥有.第二,member roles that have been granted membership with the 102 option automatically have use of the privileges of those roles,包括由这些角色继承的任何特权.

只使用administrator个特权作为test_user,而不在它们之间切换:demo

GRANT administrator TO test_user WITH INHERIT TRUE;

这通常是默认设置.不会的原因可以在GRANT command doc强中找到:

如果将INHERIT选项设置为TRUE,则会使成员继承所授予角色的权限.也就是说,它可以自动使用授予该角色的任何数据库权限.如果设置为FALSE,则成员不继承所授予角色的权限.如果没有指明这一条,它就是defaults to true if the member role is set to 101 and to false if the member role is set to 105条.请参见CREATE ROLE.

CREATE ROLE...[NO]INHERIT名开始:

当使用GRANT语句将一个角色中的成员资格授予另一个角色时,GRANT可以使用WITH INHERIT子句来指定新成员是否应该"继承"所授予角色的特权.如果GRANT语句未指定这两种继承行为,则为the new 100 will be created 105 if the member role is set to 106 and to 107 if it is set to 108.

在16之前的PostgreSQL版本中,GRANT 语句不支持WITH INVERIT.因此,更改此角色级别属性还会更改现有授权的行为.情况已经不再是这样了.

Sql相关问答推荐

获取家谱树中第一次出现的特定信息,然后停止

判断Pyspark生成的SQL查询

基于模式或其他行集的数据复制

SQL查询每个客户的最新条目

如何根据计数和分组获取订单总数

PostgreSQL:使用JSONB中的字段使用jsonb_to_Records()填充记录

Oracle分层查询-两条路径在末尾合并为一条

SQL到Snowflake-转换嵌套的SELECT(值

PostgreSQL:查找继承表中的特定记录属于哪个表

用于SQL协助的XQUERY()

如何在多列上编写具有不同条件的查询?

显示十进制列,但尽可能显示为整数

统计重复记录的总数

在 R 值的 SQL 块中显示值

如何将 START 和 END 日期之间的日期差异作为 SQL 中的单独列获取

Postgresql:在链接表中判断相关表中插入值的条件

获取多个开始-结束时间戳集之间经过的时间

在presto sql中解析带有区域的时间格式

SQL Server 查找存在于所有不同时期(或序列)中的条目

将单行中的多个行值转换为列