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' | PASSWORD NULL | VALID UNTIL 'timestamp' | IN ROLErole_name[, ...] | IN GROUProle_name[, ...] | ROLErole_name[, ...] | ADMINrole_name[, ...] | USERrole_name[, ...] | SYSIDuid
CREATE ROLE向 PostgreSQL数据库集簇中新增一个角色。角色是一种 可以拥有数据库对象并拥有数据库权限的实体;根据其使用方式,它既可以视为 “用户”,也可以视为“组”,或者兼具这两种身份。有关 用户管理和认证的信息,请参见Chapter 21和Chapter 20。要使用该命令,你必须拥有 CREATEROLE权限,或者是数据库超级用户。
注意,角色是在数据库集簇级别定义的,因此在该集簇中的所有数据库里都有效。
name新角色的名称。
SUPERUSERNOSUPERUSER这些子句决定新角色是否为“超级用户”;超级用户可以绕过数据库中的 所有访问限制。超级用户身份具有危险性,只有在确有需要时才应使用。要创建 新的超级用户,你自己必须先是超级用户。若未指定,默认值是 NOSUPERUSER。
CREATEDBNOCREATEDB这些子句定义角色创建数据库的能力。如果指定CREATEDB,则允许正在定义的角色创建新数据库。指定NOCREATEDB会禁止角色创建数据库。如果未指定,默认值为NOCREATEDB。
CREATEROLENOCREATEROLE这些子句决定某个角色是否被允许创建、更改、删除其他角色,为其添加注释, 以及更改其安全标签。关于该权限赋予的具体能力,参见 创建角色。若未指定,默认值是 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 LIMIT connlimit如果该角色可以登录,此项指定该角色可建立多少并发连接。-1(默认值) 表示不限制。注意,只有普通连接会计入此限制;预备事务和后台工作进程 连接都不会计入此限制。
ENCRYPTED ] PASSWORD 'password'PASSWORD NULL设置角色的密码。(密码只对具有LOGIN属性的角色有用, 但即使没有该属性,你仍然可以为角色定义密码。)如果你不打算使用密码认证, 可以省略此选项。如果未指定密码,密码将被设为 null,并且该用户的密码认证 将始终失败。也可以显式写为PASSWORD NULL。
指定空字符串也会把密码设为 null,但在 PostgreSQL 10 之前并非如此。在更早的版本中, 是否可以使用空字符串取决于认证方法和具体版本,而 libpq 在任何情况下 都拒绝使用它。为避免歧义,应避免指定空字符串。
密码始终以加密形式存储在系统目录中。ENCRYPTED关键字 没有实际效果,但为了向后兼容仍会被接受。加密方式由配置参数 password_encryption决定。如果给出的密码字符串已经是 MD5 加密或 SCRAM 加密格式,那么无论password_encryption 的值是什么,它都会按原样存储(因为系统无法解密指定的已加密密码字符串, 再将其改用其他格式加密)。这样便可在转储/恢复期间重新装载已加密的密码。
VALID UNTIL 'timestamp'VALID UNTIL子句设置一个日期和时间,在此之后角色的密码将不再有效。如果省略此子句,密码将始终有效。
IN ROLE role_nameIN ROLE子句列出一个或多个现有角色,新角色会立即被添加为这些角色的新成员。(注意,没有选项能将新角色添加为管理员;请另行使用GRANT命令执行此操作。)
IN GROUP role_nameIN GROUP是IN ROLE的过时拼写。
ROLE role_nameROLE子句列出一个或多个现有角色,它们会被自动添加为新角色的成员。(这实际上使新角色成为一个“组”。)
ADMIN role_nameADMIN子句与ROLE类似,但所列角色会以WITH ADMIN OPTION加入新角色,从而有权向其他人授予此角色的成员资格。
USER role_nameUSER子句是ROLE子句的过时拼写。
SYSID uidSYSID子句会被忽略,但为了向后兼容,仍然接受它。
使用ALTER ROLE可更改 角色属性,使用DROP ROLE 可删除角色。通过CREATE ROLE指定的所有属性都可以在后续的 ALTER ROLE命令中修改。
向作为组使用的角色添加和移除成员,推荐使用 GRANT和 REVOKE。
VALID UNTIL子句只为密码定义过期时间,而不是为角色本身定义过期时间。特别是,使用非基于密码的认证方式登录时,不会强制执行该过期时间。
INHERIT属性控制可授予权限的继承(即数据库对象的访问权限和角色成员资格)。它不适用于通过CREATE ROLE和ALTER ROLE设置的特殊角色属性。例如,成为具有CREATEDB权限的角色的成员,并不会立即获得创建数据库的能力,即使设置了INHERIT也是如此;必须先通过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;
SQL 标准包含CREATE ROLE语句,但标准只要求如下语法:
CREATE ROLEname[ WITH ADMINrole_name]
多个初始管理员以及CREATE ROLE的所有其他选项,都是 PostgreSQL扩展。
SQL 标准定义了用户和角色的概念,但将它们视为不同的概念,并把所有定义用户的命令留给各数据库实现自行规定。在PostgreSQL中,我们选择将用户和角色统一为一种实体。因此,角色具有比标准中多得多的可选属性。
将用户赋予 NOINHERIT 属性,而将角色赋予 INHERIT 属性,最接近 SQL 标准规定的行为。