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

Note

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

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

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

上一章 首页 下一章