Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16

22.2. 角色属性

数据库角色可以具有多个属性,定义其特权并与客户端身份验证系统交互。

登录权限

只有具有LOGIN属性的角色才能用作数据库连接的初始角色名称。 具有LOGIN属性的角色可以被视为数据库用户的同义词。 要创建具有登录权限的角色,请使用以下任一方法:

CREATE ROLE name LOGIN;
CREATE USER name;

CREATE USER等同于CREATE ROLE, 但CREATE USER默认包含LOGIN,而CREATE ROLE不包含。)

超级用户状态

数据库超级用户绕过所有权限检查,除了登录权限。这是一个危险的特权,不应该随意使用;最好将大部分工作作为一个不是超级用户的角色来完成。 要创建一个新的数据库超级用户,使用CREATE ROLE name SUPERUSER。您必须以已经是超级用户的角色来执行此操作。

数据库创建

角色必须明确获得权限才能创建数据库(超级用户除外,因为他们可以绕过所有权限检查)。 要创建这样的角色,请使用CREATE ROLE name CREATEDB

角色创建

角色必须明确获得权限才能创建更多的角色(除了超级用户,因为他们可以绕过所有权限检查)。 要创建这样的角色,请使用CREATE ROLE name CREATEROLE。 拥有CREATEROLE特权的角色也可以修改和删除其他角色,以及授予或撤销其成员资格。 修改角色包括大多数可以使用ALTER ROLE进行的更改,例如更改密码。 还包括可以使用COMMENTSECURITY LABEL命令进行的对角色的修改。

然而,CREATEROLE并不包含创建SUPERUSER角色的能力, 也不包含对已经存在的SUPERUSER角色的任何控制权。 此外,CREATEROLE也不包含创建REPLICATION用户的权力, 也不能授予或撤销REPLICATION特权,也不能修改这些用户的角色属性。 然而,它允许在REPLICATION角色上使用ALTER ROLE ... SETALTER ROLE ... RENAME,以及使用COMMENT ON ROLESECURITY LABEL ON ROLEDROP ROLE。 最后,CREATEROLE也不授予授予或撤销BYPASSRLS特权的能力。

因为CREATEROLE权限允许用户授予或撤销即使在尚未具有任何访问权限的角色中的成员身份,一个CREATEROLE用户可以获得对系统中每个预定义角色的功能的访问权限,包括高度特权角色,如pg_execute_server_programpg_write_server_files

启动复制

一个角色必须明确被授予权限来启动流复制(除了超级用户,因为他们可以绕过所有权限检查)。 用于流复制的角色必须也具有LOGIN权限。要创建这样的角色,使用 CREATE ROLE name REPLICATION LOGIN

密码

密码仅在客户端身份验证方法要求用户在连接到数据库时提供密码时才有意义。 passwordmd5身份验证方法都使用密码。 数据库密码与操作系统密码分开。在角色创建时指定密码为 CREATE ROLE name PASSWORD 'string'

权限继承

默认情况下,角色被授予继承其成员角色特权的权限。但是,要创建一个没有此权限的角色, 使用CREATE ROLE name NOINHERIT

绕过行级安全性

一个角色必须明确获得权限来绕过每个行级安全(RLS)策略(除了超级用户,因为他们可以绕过所有权限检查)。 要创建这样一个角色,请使用CREATE ROLE name BYPASSRLS作为超级用户。 (意思是以超级用户执行这个命令)

连接限制

连接限制可以指定一个角色可以建立多少并发连接。 -1(默认值)表示没有限制。在创建角色时指定连接限制,使用 CREATE ROLE name CONNECTION LIMIT 'integer'

角色的属性可以在创建后使用ALTER ROLE进行修改。 查看有关CREATE ROLEALTER ROLE命令的参考页面以获取详细信息。

对于第 20 章中描述的运行时配置设置,一个角色也可以有角色相关的默认值。例如,如果出于某些原因你希望在每次连接时禁用索引扫描(提示:不是好主意),你可以使用:

ALTER ROLE myname SET enable_indexscan TO off;

这将保存设置(但是不会立刻设置它)。在这个角色的后续连接中,它就表现得像在会话开始之前执行过SET enable_indexscan TO off。你也可以在会话期间改变该设置,它将只是作为默认值。要移除一个角色相关的默认设置,使用ALTER ROLE rolename RESET varname。注意附加到没有LOGIN权限的角色的角色相关默认值相当无用,因为它们从不会被调用。