Note

CREATE ROLE

CREATE ROLE-定义新的数据库角色

Synopsis

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

Description

CREATE ROLE向 PostgreSQL 数据库集群添加了新角色。角色是可以拥有数据库对象并具有数据库特权的实体。根据角色的使用方式,可以将角色视为“用户”,“组”或两者。有关 Management 用户和身份验证的信息,请参阅Chapter 21Chapter 20。您必须具有CREATEROLE特权,或者是数据库超级用户才能使用此命令。

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

Parameters

  • name

    • 新角色的名称。
  • SUPERUSER
    NOSUPERUSER

    • 这些子句确定新角色是否是“超级用户”,谁可以覆盖数据库中的所有访问限制。超级用户状态很危险,应仅在 true 需要时使用。您必须自己是超级用户才能创建新的超级用户。如果未指定,则默认为NOSUPERUSER
  • CREATEDB
    NOCREATEDB

    • 这些子句定义角色创建数据库的能力。如果指定了CREATEDB,将允许所定义的角色创建新数据库。指定NOCREATEDB将使角色无法创建数据库。如果未指定,则NOCREATEDB是默认值。
  • CREATEROLE
    NOCREATEROLE

    • 这些子句确定是否允许一个角色创建新角色(即执行CREATE ROLE)。具有CREATEROLE特权的角色也可以更改和删除其他角色。如果未指定,则NOCREATEROLE是默认值。
  • INHERIT
    NOINHERIT

    • 这些子句确定角色是否“继承”它所隶属的角色的特权。具有INHERIT属性的角色可以自动使用已被授予直接或间接所属的所有角色的任何数据库特权。如果没有INHERIT,则另一个角色的成员资格只能将SET ROLE授予该另一个角色;其他角色的特权只有在这样做之后才可用。如果未指定,则默认为INHERIT
  • LOGIN
    NOLOGIN

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

    • 这些子句确定角色是否为复制角色。角色必须具有此属性(或成为超级用户),以便能够以复制模式(物理或逻辑复制)连接到服务器,并能够创建或删除复制插槽。具有REPLICATION属性的角色是具有很高特权的角色,并且仅应在实际用于复制的角色上使用。如果未指定,则默认为NOREPLICATION
  • BYPASSRLS
    NOBYPASSRLS

    • 这些子句确定角色是否绕过每个行级安全(RLS)策略。 NOBYPASSRLS是默认值。请注意,默认情况下 pg_dump 会将row_security设置为OFF,以确保转储表的所有内容。如果运行 pg_dump 的用户没有适当的权限,将返回错误。转储表的超级用户和所有者始终绕过 RLS。
  • CONNECTION LIMIT connlimit

    • 如果角色可以登录,则指定角色可以构建的并发连接数。 -1(默认值)表示没有限制。请注意,仅普通连接计入此限制。准备的事务或后台工作人员连接都不会计入此限制。
  • [ ENCRYPTED ] PASSWORD ' password '
    PASSWORD NULL

    • 设置角色的密码。 (密码仅用于具有LOGIN属性的角色,但是,如果没有角色,则可以为角色定义密码.)如果您不打算使用密码认证,则可以忽略此选项。如果未指定密码,则密码将设置为 null,并且该用户的密码身份验证将始终失败。空密码可以有选择地明确写为PASSWORD NULL

Note

指定一个空字符串也将密码设置为 null,但是在 PostgreSQL 10 之前不是这种情况。在较早的版本中,可以使用或不使用空字符串,这取决于身份验证方法和确切的版本,并且 libpq 会拒绝在任何情况下使用。为避免歧义,应避免指定空字符串。

密码始终以加密方式存储在系统目录中。 ENCRYPTED关键字无效,但为向后兼容而被接受。加密方法由配置参数password_encryption确定。如果显示的密码字符串已经采用 MD5 加密或 SCRAM 加密的格式,则将其原样存储,而不考虑password_encryption(因为系统无法解密指定的加密密码字符串,因此无法以其他格式对其进行加密)。这样可以在转储/还原期间重新加载加密的密码。

  • VALID UNTIL ' timestamp '

    • VALID UNTIL子句设置日期和时间,之后该角色的密码将不再有效。如果省略此子句,则密码将一直有效。
  • IN ROLE role_name

    • IN ROLE子句列出了一个或多个现有角色,新角色将立即作为新成员添加到其中。 (请注意,没有选项可以将新角色添加为 Management 员;请使用单独的GRANT命令来执行此操作.)
  • IN GROUP role_name

    • IN GROUPIN ROLE的过时拼写。
  • ROLE role_name

    • ROLE子句列出了一个或多个现有角色,这些角色将自动添加为新角色的成员。 (这实际上使新角色成为“组”.)
  • ADMIN role_name

    • ADMIN子句类似于ROLE,但已命名的角色已添加到新角色WITH ADMIN OPTION中,从而赋予了他们将这个角色的成员资格授予其他人的权利。
  • USER role_name

    • USER子句是ROLE子句的过时拼写。
  • SYSID uid

    • SYSID子句将被忽略,但为了向后兼容而被接受。

Notes

使用ALTER ROLE更改角色的属性,并使用DROP ROLE删除角色。 CREATE ROLE指定的所有属性都可以在以后的ALTER ROLE命令中进行修改。

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

VALID UNTIL子句仅定义密码的到期时间,而不定义角色* perse *的到期时间。特别是,使用基于非密码的身份验证方法登录时,不会强制使用到期时间。

INHERIT属性控制可授予特权(即,数据库对象和角色成员资格的访问特权)的继承。它不适用于CREATE ROLEALTER ROLE设置的特殊角色属性。例如,即使设置了INHERIT,具有CREATEDB特权的角色成员也不会立即授予创建数据库的能力;在创建数据库之前,有必要通过SET ROLE成为该角色。

INHERIT属性是向后兼容的默认属性:在 PostgreSQL 的早期版本中,用户始终有权访问其所属组的所有特权。但是,NOINHERIT与 SQL 标准中指定的语义更接近。

请注意CREATEROLE特权。 CREATEROLE角色的特权没有继承的概念。这意味着,即使一个角色没有特定的特权,但被允许创建其他角色,它也可以轻松地创建另一个角色,而该角色具有与其自身不同的特权(创建具有超级用户特权的角色除外)。例如,如果角色“用户”具有CREATEROLE特权,但没有CREATEDB特权,则它仍可以创建具有CREATEDB特权的新角色。因此,将具有CREATEROLE特权的角色视为几乎超级用户角色。

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

CONNECTION LIMIT选项仅强制执行;如果两个新会话大约同时启动,而该角色仅剩下一个连接“插槽”,则这两个会话都有可能失败。而且,永远不会对超级用户强制执行该限制。

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

Examples

创建一个可以登录但不提供密码的角色:

CREATE ROLE jonathan LOGIN;

使用密码创建角色:

CREATE USER davide WITH PASSWORD 'jw8s0F4';

(CREATE USERCREATE ROLE相同,除了它表示LOGIN.)

使用有效期至 2004 年底的密码创建角色。在 2005 年经过 1 秒钟的滴答之后,该密码不再有效。

CREATE ROLE miriam WITH LOGIN PASSWORD 'jw8s0F4' VALID UNTIL '2005-01-01';

创建一个可以创建数据库和 Management 角色的角色:

CREATE ROLE admin WITH CREATEDB CREATEROLE;

Compatibility

CREATE ROLE语句在 SQL 标准中,但是该标准仅需要以下语法

CREATE ROLE name [ WITH ADMIN role_name ]

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

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

通过为用户提供NOINHERIT属性,而为角色提供INHERIT属性,可以最接近 SQL 标准指定的行为。

See Also

SET ROLE, ALTER ROLE, DROP ROLE, GRANT, REVOKE, createuser