支持的版本: 当前 (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 是默认值。

在 16 之前的 PostgreSQL 版本中,继承是控制该角色所有运行时成员资格检查的角色级属性。

LOGIN
NOLOGIN

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

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 如何,都会按原样存储(因为系统无法解密指定的加密密码字符串,以不同的格式加密)。这允许在转储/恢复期间重新加载加密密码。

VALID UNTIL 'timestamp'

VALID UNTIL 子句设置一个日期和时间,在此日期和时间之后,角色的密码不再有效。如果省略此子句,则密码将始终有效。

IN ROLE role_name

IN ROLE 子句使新角色自动添加为指定现有角色的成员。新的成员关系将启用 SET 选项并禁用 ADMIN 选项。INHERIT 选项将被启用,除非指定了 NOINHERIT 选项。

ROLE 角色名

ROLE 子句使一个或多个指定的现有角色自动添加为成员,并启用 SET 选项。这实际上使新角色成为一个。在此子句中,具有角色级 INHERIT 属性的角色将在新的成员关系中启用 INHERIT 选项。新的成员关系将禁用 ADMIN 选项。

ADMIN 角色名

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 相同的功能(实际上,它调用此命令),但可以从命令 shell 运行。

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 [, ...]

提交更正

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