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
[, ...] | ROLErole_name
[, ...] | ADMINrole_name
[, ...] | SYSIDuid
CREATE ROLE
向PostgreSQL数据库集簇增加一个新的角色。一个角色是一个实体,它可以拥有数据库对象并且拥有数据库特权。根据一个角色如何被使用,它可以被考虑成一个“用户”、一个“组”或者两者。有关管理用户和认证的信息可以参考Chapter 21和Chapter 20。要使用这个命令,你必须具有CREATEROLE
特权或者成为一个数据库超级用户。
注意角色是定义在数据库集簇层面上的,并且因此在集簇中的所有数据库中都可用。
在创建角色时,可以立即将新创建的角色分配为现有角色的成员,
也可以将现有角色分配为新创建角色的成员。启用哪些初始角色
成员选项的规则在下面的IN ROLE
、ROLE
和
ADMIN
子句中描述。GRANT命令在成员创建
过程中提供了细粒度的选项控制,并且可以在新角色创建后修改这些选项。
name
新角色的名称。
SUPERUSER
NOSUPERUSER
这些子句决定新角色是否是一个“超级用户”,它可以越过数据库内的所有访问限制。超级用户状态很危险并且只应该在确实需要时才用。要创建一个新超级用户,你必须自己是一个超级用户。如果没有指定,默认值是NOSUPERUSER
。
CREATEDB
NOCREATEDB
这些条款定义了角色创建数据库的能力。如果指定了
CREATEDB
,则被定义的角色将被允许创建新数据库。
指定NOCREATEDB
将拒绝角色创建数据库的能力。
如果未指定,NOCREATEDB
是默认值。
只有超级用户角色或具有CREATEDB
权限的角色
才能指定CREATEDB
。
CREATEROLE
NOCREATEROLE
这些条款决定了一个角色是否被允许创建、修改、删除、评论以及更改其他角色的
安全标签。
有关此权限授予的功能的更多详细信息,请参见
角色创建。
如果未指定,默认值为NOCREATEROLE
。
INHERIT
NOINHERIT
这会影响当此角色作为另一个角色的成员添加时的成员继承状态,
无论是在当前命令还是未来的命令中。具体来说,它控制使用
IN ROLE
子句在此命令中添加的成员资格的继承状态,
以及在后续命令中使用ROLE
子句时的继承状态。
它还用作使用GRANT
命令将此角色作为成员添加时的
默认继承状态。如果未指定,INHERIT
是默认值。
在PostgreSQL 16版本之前, 继承是一个角色级别的属性,用于控制该角色的所有运行时成员检查。
LOGIN
NOLOGIN
这些子句决定一个角色是否被允许登录,也就是在客户端连接期间该角色是否能被
给定为初始会话认证名称。一个具有LOGIN
属性的角色可以被
考虑为一个用户。没有这个属性的角色对于管理数据库特权很有用,但是却不是
用户这个词的通常意义。如果没有指定,默认值是NOLOGIN
,
不过当CREATE ROLE
被通过
CREATE USER
调用时默认值会是LOGIN
。
REPLICATION
NOREPLICATION
这些条款决定了一个角色是否是复制角色。一个角色必须具有此属性
(或是超级用户)才能以复制模式(物理或逻辑复制)连接到服务器,
并且才能创建或删除复制槽。
拥有REPLICATION
属性的角色是一个非常高权限的角色,
应仅用于实际用于复制的角色。如果未指定,
NOREPLICATION
是默认值。
只有超级用户角色或具有REPLICATION
的角色
才能指定REPLICATION
。
BYPASSRLS
NOBYPASSRLS
这些条款决定了一个角色是否绕过每个行级安全(RLS)策略。
NOBYPASSRLS
是默认值。只有超级用户角色或具有
BYPASSRLS
权限的角色可以指定 BYPASSRLS
。
注意 pg_dump 将默认把row_security
设置为OFF
,
以确保一个表的所有内容被转储出来。如果运行 pg_dump 的用户不具有适当的权限,将会返回一个错误。
但是,超级用户和被转储表的拥有者总是可以绕过 RLS。
CONNECTION LIMIT
connlimit
如果角色能登录,这指定该角色能建立多少并发连接。-1(默认值)表示无限制。注意这个限制仅针对于普通连接。预备事务和后台工作者连接都不受这一限制管辖。
ENCRYPTED
] PASSWORD
'password
'PASSWORD NULL
设置角色的口令(口令只对具有LOGIN
属性的角色有用,但是不管怎样你还是可以为没有该属性的角色定义一个口令)。如果你没有计划使用口令认证,你可以忽略这个选项。如果没有指定口令,口令将被设置为空并且该用户的口令认证总是会失败。也可以用PASSWORD NULL
显式地写出一个空口令。
指定一个空字符串也将把口令设置为空,但是在PostgreSQL版本10之前是不能这样做的。在早期的版本中,是否可以使用空字符串取决于认证方法和确切的版本,而libpq在任何情况下都将拒绝使用空字符串。为了避免混淆,应该避免指定空字符串。
口令总是以加密的方式存放在系统目录中。ENCRYPTED
关键词没有实际效果,它只是为了向后兼容性而存在。加密的方法由配置参数password_encryption决定。如果当前的口令字符串已经是MD5加密或者SCRAM加密的格式,那么不管password_encryption
的值是什么,口令字符串还是原样存储(因为系统无法解密以不同格式加密的口令字符串)。这种方式允许在转储/恢复时重载加密的口令。
VALID UNTIL
'timestamp
'
VALID UNTIL
机制设置一个日期和时间,在该时间点之后角色的口令将会失效。如果这个子句被忽略,那么口令将总是有效。
IN ROLE
role_name
IN ROLE
子句会使新角色自动作为指定现有角色的成员添加。
新的成员资格将启用SET
选项,并禁用ADMIN
选项。除非指定了NOINHERIT
选项,否则将启用
INHERIT
选项。
ROLE
role_name
ROLE
子句会自动将一个或多个指定的现有角色添加为成员,
并启用SET
选项。这实际上使新角色成为一个“组”。
在此子句中指定的具有角色级别INHERIT
属性的角色将
在新成员资格中启用INHERIT
选项。新成员资格将禁用
ADMIN
选项。
ADMIN
role_name
ADMIN
子句与ROLE
具有相同的效果,但指定的角色会作为新角色的成员
添加,并启用了ADMIN
,赋予它们将新角色的成员资格授予他人的权利。
SYSID
uid
SYSID
子句会被忽略,但是会为了向后兼容,还是会接受它。
使用ALTER ROLE
来更改
一个角色的属性,以及使用DROP ROLE
来移除一个角色。
所有用CREATE ROLE
指定的属性可以被后来的ALTER ROLE
命令所修改。
增加和移除组角色成员的最佳方式是使用
GRANT
和
REVOKE
。
VALID UNTIL
子句只为一个口令而不是为一个角色本身定义了一个过期时间。特别地,当使用一个非基于口令认证的方法登录时,过期时间是不会被强制的。
这里定义的角色属性是不可继承的,也就是说,成为具有例如
CREATEDB
的角色的成员,并不会允许该成员创建新数据库,
即使成员资格授予具有INHERIT
选项。当然,如果成员资格
授予具有SET
选项,成员角色将能够
SET ROLE
到
createdb角色,然后创建一个新数据库。
由IN ROLE
、ROLE
和ADMIN
子句创建的成员资格将执行此命令的角色作为授予者。
INHERIT
属性是用于向后兼容原因的默认值:在早前的PostgreSQL发布中,用户总是能够访问其所属组的所有特权。不过,NOINHERIT
更加接近于 SQL 标准中指定的语义。
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中,我们已经选择把用户和角色统一成一种单一实体类型。因此角色比起标准中拥有更多可选的属性。
SQL标准指定的行为最接近于创建具有NOINHERIT
选项的
PostgreSQL角色作为SQL标准用户,以及具有
INHERIT
选项的PostgreSQL
角色作为SQL标准角色。
USER
子句的行为与ROLE
相同,但已被弃用:
USER role_name
[, ...]
IN GROUP
子句的行为与IN ROLE
相同,但已被弃用:
IN GROUP role_name
[, ...]