2025年9月25日: PostgreSQL 18 发布!
支持的版本:当前18)/ 17 / 16 / 15 / 14 / 13
开发版本:devel
不支持的版本: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

CREATE ROLE

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

概要

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

where option can be:

      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 [, ...]
    | ROLE role_name [, ...]
    | ADMIN role_name [, ...]
    | SYSID uid

描述

CREATE ROLEPostgreSQL 数据库集群添加一个新角色。角色是拥有数据库对象和拥有数据库权限的实体;一个角色可以被视为一个用户、一个,或者两者兼有,具体取决于其使用方式。有关管理用户和身份验证的信息,请参阅第 21 章第 20 章。您必须拥有 CREATEROLE 权限或是一名数据库超级用户才能使用此命令。

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

在创建角色时,可以立即将新创建的角色分配为现有角色的成员,也可以将现有角色分配为新创建角色的成员。初始角色成员资格选项的规则在下面的 IN ROLEROLEADMIN 子句中进行了描述。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 调用。

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 属性的角色有用,但您仍然可以为没有该属性的角色定义一个。)如果您不打算使用密码身份验证,则可以省略此选项。如果未指定密码,密码将设置为 null,并且该用户始终会密码身份验证失败。null 密码也可以通过 PASSWORD NULL 显式写入。

注意

指定空字符串也将把密码设置为 null,但这在 PostgreSQL 10 版本之前并非如此。在早期版本中,可以根据身份验证方法和确切版本使用空字符串,libpq 无论如何都会拒绝使用它。为避免歧义,应避免使用空字符串。

密码始终以加密形式存储在系统目录中。ENCRYPTED 关键字不起作用,但为了向后兼容而被接受。加密方法由配置参数 password_encryption 决定。如果提供的密码字符串已经是 MD5 加密或 SCRAM 加密格式,则无论 password_encryption 如何,它都会按原样存储(因为系统无法解密指定的加密密码字符串以另一种格式进行加密)。这允许在转储/恢复期间重新加载加密的密码。

警告

MD5 加密密码的支持已弃用,将在 PostgreSQL 的未来版本中移除。有关迁移到其他密码类型的详细信息,请参阅第 20.5 节

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 命令进行修改。

添加和删除用作组的角色成员的首选方法是使用 GRANTREVOKE

VALID UNTIL 子句仅定义密码的过期时间,而不是角色本身的过期时间。特别是,当使用非密码身份验证方法登录时,不会强制执行过期时间。

此处定义的角色属性是非继承的,即,成为一个具有(例如)CREATEDB 的角色的成员将不会允许该成员创建新数据库,即使该成员资格授予具有 INHERIT 选项。当然,如果成员资格授予具有 SET 选项,则成员角色可以 SET ROLE 到 createdb 角色,然后创建新数据库。

IN ROLEROLEADMIN 子句创建的成员资格授予将执行此命令的角色作为授予者。

出于向后兼容的原因,INHERIT 属性是默认值:在 PostgreSQL 的先前版本中,用户始终可以访问他们是其成员的组的所有特权。然而,NOINHERIT 更接近 SQL 标准中指定的语义。

PostgreSQL 包含一个名为 createuser 的程序,它具有与 CREATE ROLE 相同的功能(实际上,它调用此命令),但可以从命令行运行。

CONNECTION LIMIT 选项仅近似强制执行;如果两个新会话在角色仅剩一个连接时大约同时启动,则两者都可能失败。此外,此限制从不对超级用户强制执行。

在使用此命令指定未加密密码时,必须格外小心。密码将以明文形式传输到服务器,并且可能记录在客户端的命令历史记录或服务器日志中。但是,createuser 命令会加密传输密码。此外,psql 包含一个名为 \password 的命令,可用于稍后安全地更改密码。

示例

创建一个可以登录的角色,但不要给它设置密码

CREATE ROLE jonathan LOGIN;

创建一个带密码的角色

CREATE USER davide WITH PASSWORD 'jw8s0F4';

(CREATE USERCREATE 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 ROLE name [ WITH ADMIN role_name ]

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

SQL 标准定义了用户和角色的概念,但它将它们视为不同的概念,并将所有定义用户的命令留给每个数据库实现来指定。在 PostgreSQL 中,我们选择将用户和角色统一为一种实体。因此,角色拥有比标准中更多的可选属性。

SQL 标准所指定的行为最接近于将 SQL 标准用户创建为具有 NOINHERIT 选项的 PostgreSQL 角色,以及将 SQL 标准角色创建为具有 INHERIT 选项的 PostgreSQL 角色。

USER 子句的行为与 ROLE 相同,但已被弃用。

USER role_name [, ...]

IN GROUP 子句的行为与 IN ROLE 相同,但已被弃用。

IN GROUP role_name [, ...]

提交更正

如果您在文档中看到任何不正确、与您在该特定功能上的经验不符或需要进一步澄清的内容,请使用此表单报告文档问题。