↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1
历史版本。 PostgreSQL 13 已结束支持。 2025-11-13. 请参阅 当前版本手册.

CREATE ROLE

CREATE ROLE — 定义一个新的数据库角色

大纲

CREATE ROLE name [ [ WITH ] option [ ... ] ]

其中option可以是:

      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | REPLICATION | NOREPLICATION
    | BYPASSRLS | NOBYPASSRLS
    | CONNECTION LIMIT connlimit
    | [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL
    | VALID UNTIL 'timestamp'
    | IN ROLE role_name [, ...]
    | IN GROUP role_name [, ...]
    | ROLE role_name [, ...]
    | ADMIN role_name [, ...]
    | USER role_name [, ...]
    | SYSID uid

描述

CREATE ROLE 向 PostgreSQL 数据库集簇中新增一个角色。角色是一种可以拥有数据库对象并拥有数据库权限的实体;根据其使用方式,它既可以视为“用户”,也可以视为“组”,或者兼具这两种身份。有关用户管理和认证的信息,请参见第 21 章和第 20 章。要使用该命令,你必须拥有 CREATEROLE 权限,或者是数据库超级用户。

注意,角色是在数据库集簇级别定义的,因此在该集簇中的所有数据库里都有效。

参数

name

新角色的名称。

SUPERUSER
NOSUPERUSER

这些子句决定新角色是否为“超级用户”;超级用户可以绕过数据库中的所有访问限制。超级用户身份具有危险性,只有在确有需要时才应使用。要创建新的超级用户,你自己必须先是超级用户。若未指定,默认值是 NOSUPERUSER。

CREATEDB
NOCREATEDB

这些子句定义角色创建数据库的能力。如果指定 CREATEDB,则允许正在定义的角色创建新数据库。指定 NOCREATEDB 会禁止角色创建数据库。如果未指定,默认值为 NOCREATEDB。

CREATEROLE
NOCREATEROLE

这些子句决定某个角色是否被允许创建、更改、删除其他角色,为其添加注释,更改其安全标签,以及授予或撤销其中的成员资格。关于该权限赋予的具体能力,参见创建角色。若未指定,默认值是 NOCREATEROLE。

INHERIT
NOINHERIT

这些子句决定角色是否“继承”其所属角色的权限。具有 INHERIT 属性的角色可以自动使用直接或间接所属的所有角色获得的任何数据库权限。没有 INHERIT 时,成为另一个角色的成员只授予对该角色执行 SET ROLE 的能力;另一个角色的权限只有在执行该操作后才可用。如果未指定,默认值为 INHERIT。

LOGIN
NOLOGIN

这些子句决定是否允许角色登录;也就是说,在客户端连接期间,是否可以将该角色作为初始会话授权名称。具有 LOGIN 属性的角色可以视为用户。没有该属性的角色可用于管理数据库权限,但通常意义上不属于用户。如果未指定,默认值为 NOLOGIN,但通过其另一种拼写 CREATE USER 调用 CREATE ROLE 时除外。

REPLICATION
NOREPLICATION

这些子句决定角色是否为复制角色。角色必须具有此属性(或是超级用户),才能以复制模式(物理复制或逻辑复制)连接到服务器,以及创建或删除复制槽。具有 REPLICATION 属性的角色权限非常高,因此该属性只应赋予实际用于复制的角色。如果未指定,默认值为 NOREPLICATION。要创建具有 REPLICATION 属性的新角色,必须是超级用户。

BYPASSRLS
NOBYPASSRLS

这些子句决定角色是否绕过每个行级安全(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_name

IN ROLE 子句列出一个或多个现有角色,新角色会立即被添加为这些角色的新成员。(注意,没有选项能将新角色添加为管理员;请另行使用 GRANT 命令执行此操作。)

IN GROUP role_name

IN GROUP 是 IN ROLE 的过时拼写。

ROLE role_name

ROLE 子句列出一个或多个现有角色,它们会被自动添加为新角色的成员。(这实际上使新角色成为一个“组”。)

ADMIN role_name

ADMIN 子句与 ROLE 类似,但所列角色会以 WITH ADMIN OPTION 加入新角色,从而有权向其他人授予此角色的成员资格。

USER role_name

USER 子句是 ROLE 子句的过时拼写。

SYSID uid

SYSID 子句会被忽略,但为了向后兼容,仍然接受它。

注解

使用 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 ROLE name [ WITH ADMIN role_name ]

多个初始管理员以及 CREATE ROLE 的所有其他选项,都是 PostgreSQL 扩展。

SQL 标准定义了用户和角色这两个概念,但将它们视为彼此不同的概念,并把所有用于定义用户的命令留给各个数据库实现自行规定。在 PostgreSQL 中,我们选择将用户和角色统一为同一类实体。因此,角色拥有的可选属性比标准中更多。

将用户赋予 NOINHERIT 属性,而将角色赋予 INHERIT 属性,最接近 SQL 标准规定的行为。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.