CREATE ROLE
CREATE ROLE — 定义一个新的数据库角色
大纲
CREATE ROLEname[ [ WITH ]option[ ... ] ] 其中option可以是: SUPERUSER | NOSUPERUSER | CREATEDB | NOCREATEDB | CREATEROLE | NOCREATEROLE | INHERIT | NOINHERIT | LOGIN | NOLOGIN | REPLICATION | NOREPLICATION | BYPASSRLS | NOBYPASSRLS | CONNECTION LIMITconnlimit| [ ENCRYPTED ] PASSWORD 'password' | VALID UNTIL 'timestamp' | IN ROLErole_name[, ...] | IN GROUProle_name[, ...] | ROLErole_name[, ...] | ADMINrole_name[, ...] | USERrole_name[, ...] | SYSIDuid
描述
CREATE ROLE 向
PostgreSQL 数据库集簇中新增一个角色。角色是一种可以拥有数据库对象并拥有数据库权限的实体;根据其使用方式,它既可以视为“用户”,也可以视为“组”,或者兼具这两种身份。有关用户管理和认证的信息,请参见第 21 章和第 20 章。要使用该命令,你必须拥有
CREATEROLE 权限,或者是数据库超级用户。
注意,角色是在数据库集簇级别定义的,因此在该集簇中的所有数据库里都有效。
参数
name新角色的名称。
SUPERUSERNOSUPERUSER这些子句决定新角色是否为“超级用户”;超级用户可以绕过数据库中的所有访问限制。超级用户身份具有危险性,只有在确有需要时才应使用。要创建新的超级用户,你自己必须先是超级用户。若未指定,默认值是
NOSUPERUSER。CREATEDBNOCREATEDB这些子句定义角色创建数据库的能力。如果指定
CREATEDB,则允许正在定义的角色创建新数据库。指定NOCREATEDB会禁止角色创建数据库。如果未指定,默认值为NOCREATEDB。CREATEROLENOCREATEROLE这些子句决定是否允许角色创建新角色(即执行
CREATE ROLE)。具有CREATEROLE权限的角色还可以更改和删除其他角色。如果未指定,默认值为NOCREATEROLE。INHERITNOINHERIT这些子句决定角色是否“继承”其所属角色的权限。具有
INHERIT属性的角色可以自动使用直接或间接所属的所有角色获得的任何数据库权限。没有INHERIT时,成为另一个角色的成员只授予对该角色执行SET ROLE的能力;另一个角色的权限只有在执行该操作后才可用。如果未指定,默认值为INHERIT。LOGINNOLOGIN这些子句决定是否允许角色登录;也就是说,在客户端连接期间,是否可以将该角色作为初始会话授权名称。具有
LOGIN属性的角色可以视为用户。没有该属性的角色可用于管理数据库权限,但通常意义上不属于用户。如果未指定,默认值为NOLOGIN,但通过其另一种拼写 CREATE USER 调用CREATE ROLE时除外。REPLICATIONNOREPLICATION这些子句决定角色是否为复制角色。角色必须具有此属性(或是超级用户),才能以复制模式(物理复制或逻辑复制)连接到服务器,以及创建或删除复制槽。具有
REPLICATION属性的角色权限非常高,因此该属性只应赋予实际用于复制的角色。如果未指定,默认值为NOREPLICATION。要创建具有REPLICATION属性的新角色,必须是超级用户。BYPASSRLSNOBYPASSRLS这些子句决定角色是否绕过每个行级安全(RLS)策略。
NOBYPASSRLS是默认值。要创建具有BYPASSRLS属性的新角色,必须是超级用户。注意,pg_dump 默认会把
row_security设置为OFF,以确保能够转储表中的全部内容。如果运行 pg_dump 的用户没有适当权限,将返回错误。不过,超级用户和被转储表的拥有者总是会绕过 RLS。CONNECTION LIMITconnlimit如果该角色可以登录,此项指定该角色可建立多少并发连接。-1(默认值)表示不限制。注意,只有普通连接会计入此限制;预备事务和后台工作进程连接都不会计入此限制。
- [
ENCRYPTED]PASSWORDpassword 设置角色的密码。(密码只对具有
LOGIN属性的角色有用,但即使没有该属性,你仍然可以为角色定义密码。)如果你不打算使用密码认证,可以省略此选项。如果未指定密码,密码将被设为 null,并且该用户的密码认证将始终失败。也可以显式写为PASSWORD NULL。注意
指定空字符串也会把密码设为 null,但在 PostgreSQL 10 之前并非如此。在更早的版本中,是否可以使用空字符串取决于认证方法和具体版本,而 libpq 在任何情况下都拒绝使用它。为避免歧义,应避免指定空字符串。
密码始终以加密形式存储在系统目录中。
ENCRYPTED关键字没有实际效果,但为了向后兼容仍会被接受。加密方式由配置参数 password_encryption 决定。如果给出的密码字符串已经是 MD5 加密或 SCRAM 加密格式,那么无论password_encryption的值是什么,它都会按原样存储(因为系统无法解密指定的已加密密码字符串,再将其改用其他格式加密)。这样便可在转储/恢复期间重新装载已加密的密码。VALID UNTIL'timestamp'VALID UNTIL子句设置一个日期和时间,在此之后角色的密码将不再有效。如果省略此子句,密码将始终有效。IN ROLErole_nameIN ROLE子句列出一个或多个现有角色,新角色会立即作为新成员加入这些角色。(请注意,无法通过此选项将新角色添加为管理员;要实现这一点,请使用单独的GRANT命令。)IN GROUProle_nameIN GROUP是IN ROLE的已废弃写法。ROLErole_nameROLE子句列出一个或多个现有角色,这些角色会自动作为新角色的成员加入。(实际上,这会使新角色成为一个“组”。)ADMINrole_nameADMIN子句类似于ROLE,但指定的角色会以WITH ADMIN OPTION加入新角色,从而获得向其他人授予该角色成员资格的权利。USERrole_nameUSER子句是ROLE子句的已废弃写法。SYSIDuidSYSID子句会被忽略,但为向后兼容而接受。
注解
使用 ALTER ROLE 更改角色属性,并使用 DROP ROLE 删除角色。CREATE ROLE 指定的所有属性都可以由后续的 ALTER ROLE 命令修改。
向作为组使用的角色添加和移除成员,推荐使用 GRANT 和 REVOKE。
VALID UNTIL 子句只为密码定义过期时间,而不是为角色本身定义过期时间。特别是,使用非基于密码的认证方式登录时,不会强制执行该过期时间。
INHERIT 属性控制可授予权限的继承(即数据库对象的访问权限和角色成员资格)。它不适用于 CREATE ROLE 和 ALTER ROLE 设置的特殊角色属性。例如,即使设置了 INHERIT,成为拥有 CREATEDB 权限的角色成员也不会立即获得创建数据库的能力;在创建数据库之前,必须先通过 SET ROLE 成为该角色。
INHERIT 属性出于向后兼容的原因而成为默认值:在 PostgreSQL 的早期版本中,用户总能访问其所属组的所有权限。不过,NOINHERIT 更接近 SQL 标准规定的语义。
请谨慎对待 CREATEROLE 权限。CREATEROLE 角色的权限不存在继承这一概念。这意味着,即使某个角色没有特定权限但被允许创建其他角色,它仍可轻易创建一个权限不同于自身的角色(创建具有超级用户权限的角色除外)。例如,如果角色“user”具有 CREATEROLE 权限但没有 CREATEDB 权限,它仍然可以创建一个具有 CREATEDB 权限的新角色。因此,应将拥有 CREATEROLE 权限的角色视为几乎等同超级用户的角色。
PostgreSQL 包含一个程序 createuser,其功能与 CREATE ROLE 相同(实际上它就是调用此命令),但它可以从命令 shell 中运行。
CONNECTION LIMIT 选项只是近似地被强制执行;如果两个新会话在几乎同一时刻启动,而此时该角色只剩下一个连接“槽”,则两者都可能失败。此外,该限制从不对超级用户强制执行。
用此命令指定未加密密码时必须谨慎。密码会以明文形式传输到服务器,也可能被记录在客户端命令历史或服务器日志中。而命令 createuser 传输的是加密密码。此外,psql 包含
\password 命令,可用于稍后安全地更改密码。
示例
创建一个可登录但没有密码的角色:
CREATE ROLE jonathan LOGIN;
创建一个带密码的角色:
CREATE USER davide WITH PASSWORD 'jw8s0F4';
(CREATE USER 与 CREATE ROLE 相同,只是它隐含指定了 LOGIN。)
创建一个密码有效期截止到 2004 年底的角色。当 2005 年的第一秒过去后,该密码就不再有效。
CREATE ROLE miriam WITH LOGIN PASSWORD 'jw8s0F4' VALID UNTIL '2005-01-01';
创建一个可以创建数据库并管理角色的角色:
CREATE ROLE admin WITH CREATEDB CREATEROLE;
兼容性
该 CREATE ROLE 语句在 SQL 标准中有定义,但该标准只要求以下语法
CREATE ROLEname[ WITH ADMINrole_name]
多个初始管理员,以及 CREATE ROLE 的所有其他选项,都是 PostgreSQL 扩展。
SQL 标准定义了用户和角色的概念,但将它们视为不同的概念,并将定义用户的所有命令留给各数据库实现自行规定。在 PostgreSQL 中,我们选择将用户和角色统一为一种实体。因此,与标准相比,角色具有更多可选属性。
将用户赋予 NOINHERIT 属性,而将角色赋予
INHERIT 属性,最接近 SQL 标准规定的行为。