数据库角色可以具有多个属性,这些属性定义其权限,并与客户端认证系统交互。
只有具有 LOGIN 属性的角色才能用作数据库连接的初始角色名。具有 LOGIN 属性的角色可以视为“数据库用户”。要创建具有登录权限的角色,可以使用以下任一命令:
CREATE ROLEnameLOGIN; CREATE USERname;
(CREATE USER 等价于 CREATE ROLE,区别在于 CREATE USER 包含 LOGIN,而 CREATE ROLE 不会如此。)
数据库超级用户会绕过除登录权之外的所有权限检查。这是一种危险的权限,不应草率使用;最好以非超级用户角色完成大部分工作。要创建新的数据库超级用户,使用CREATE ROLE 。这必须由已经是超级用户的角色来执行。name SUPERUSER
角色必须被明确授予创建数据库的权限(超级用户除外,因为后者会绕过所有权限检查)。要创建这样的角色,使用CREATE ROLE 。name CREATEDB
角色必须被明确授予创建更多角色的权限(超级用户除外,因为后者会绕过所有权限检查)。要创建这样的角色,使用CREATE ROLE 。 具有name CREATEROLECREATEROLE权限的角色,也可以更改和删除其他角色,并且可以授予或撤销其中的成员资格。更改角色包括使用ALTER ROLE能进行的大多数修改,例如更改密码。它还包括使用COMMENT和SECURITY LABEL命令对角色进行的修改。
然而,CREATEROLE并不赋予创建SUPERUSER角色的能力,也不赋予对已经存在的SUPERUSER角色的任何控制权。此外,CREATEROLE也不赋予创建REPLICATION用户的能力,也不能授予或撤销REPLICATION权限,也不能修改这类用户的角色属性。不过,它允许在REPLICATION角色上使用ALTER ROLE ... SET和ALTER ROLE ... RENAME,以及使用COMMENT ON ROLE、SECURITY LABEL ON ROLE和DROP ROLE。最后,CREATEROLE也不赋予授予或撤销BYPASSRLS权限的能力。
由于CREATEROLE权限允许用户即使对某些角色(尚)没有任何访问权,也能授予或撤销其中的成员资格,因此CREATEROLE用户可以获得系统中每个预定义角色的能力,包括pg_execute_server_program和pg_write_server_files这类高权限角色。
角色必须被明确授予发起流复制的权限(超级用户除外,因为后者会绕过所有权限检查)。用于流复制的角色还必须具有LOGIN权限。要创建这样的角色,使用CREATE ROLE 。name REPLICATION LOGIN
只有在客户端认证方法要求用户连接数据库时提供密码时,密码才有意义。password和md5认证方法都会使用密码。数据库密码与操作系统密码是分离的。可在创建角色时通过CREATE ROLE 指定密码。name PASSWORD 'string'
默认情况下,角色会继承其所属角色的权限。不过,要创建一个默认不继承权限的角色,使用CREATE ROLE 。name NOINHERIT
角色必须被明确授予绕过每一条行级安全(RLS)策略的权限(超级用户除外,因为后者会绕过所有权限检查)。要创建这样的角色,必须以超级用户身份使用CREATE ROLE 。name BYPASSRLS
连接限制可以指定一个角色能够建立多少个并发连接。-1(默认值)表示无限制。可在创建角色时通过CREATE ROLE 指定连接限制。name CONNECTION LIMIT 'integer'
角色创建后,可以使用以下命令修改其属性: ALTER ROLE。 详情请参见 CREATE ROLE 和 ALTER ROLE 命令的参考页。
角色还可以为 Chapter 19 中描述的许多运行时配置设置指定角色专属的默认值。例如,如果出于某种原因,你希望每次连接时都禁用索引扫描(提示:这不是一个好主意),可以使用:
ALTER ROLE myname SET enable_indexscan TO off;
这会保存该设置(但不会立即设置它)。此角色后续建立的连接就好像在会话开始前刚执行过 SET enable_indexscan TO off 一样。在会话期间仍然可以更改这一设置;它只是默认值。要移除角色专属的默认设置,请使用 ALTER ROLE 。请注意,附加在没有 rolename RESET varnameLOGIN 权限的角色上的角色专属默认值几乎没有用处,因为它们永远不会被调用。