On this page
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'
| 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 21和Chapter 20。您必须具有CREATEROLE
特权,或者是数据库超级用户才能使用此命令。
请注意,角色是在数据库集群级别定义的,因此在集群中的所有数据库中均有效。
Parameters
name
- 新角色的名称。
SUPERUSER
NOSUPERUSER
- 这些子句确定新角色是否是“超级用户”,谁可以覆盖数据库中的所有访问限制。超级用户状态很危险,应仅在 true 需要时使用。您必须自己是超级用户才能创建新的超级用户。如果未指定,则默认为
NOSUPERUSER
。
- 这些子句确定新角色是否是“超级用户”,谁可以覆盖数据库中的所有访问限制。超级用户状态很危险,应仅在 true 需要时使用。您必须自己是超级用户才能创建新的超级用户。如果未指定,则默认为
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
时。
- 这些子句确定是否允许角色登录。也就是说,是否可以在 Client 端连接期间将角色指定为初始会话授权名称。可以将具有
REPLICATION
NOREPLICATION
- 这些子句确定角色是否为复制角色。角色必须具有此属性(或成为超级用户),以便能够以复制模式(物理或逻辑复制)连接到服务器,并能够创建或删除复制插槽。具有
REPLICATION
属性的角色是具有很高特权的角色,并且仅应在实际用于复制的角色上使用。如果未指定,则默认为NOREPLICATION
。
- 这些子句确定角色是否为复制角色。角色必须具有此属性(或成为超级用户),以便能够以复制模式(物理或逻辑复制)连接到服务器,并能够创建或删除复制插槽。具有
BYPASSRLS
NOBYPASSRLS
- 这些子句确定角色是否绕过每个行级安全(RLS)策略。
NOBYPASSRLS
是默认值。请注意,默认情况下 pg_dump 会将row_security
设置为OFF
,以确保转储表的所有内容。如果运行 pg_dump 的用户没有适当的权限,将返回错误。转储表的超级用户和所有者始终绕过 RLS。
- 这些子句确定角色是否绕过每个行级安全(RLS)策略。
CONNECTION LIMIT
connlimit
- 如果角色可以登录,则指定角色可以构建的并发连接数。 -1(默认值)表示没有限制。请注意,仅普通连接计入此限制。准备的事务或后台工作人员连接都不会计入此限制。
[
ENCRYPTED
]PASSWORD
password
- 设置角色的密码。 (密码仅用于具有
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 GROUP
是IN 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
命令中进行修改。
添加和删除用作组的角色成员的首选方法是使用GRANT和REVOKE。
VALID UNTIL
子句仅定义密码的到期时间,而不定义角色* perse *的到期时间。特别是,使用基于非密码的身份验证方法登录时,不会强制使用到期时间。
INHERIT
属性控制可授予特权(即,数据库对象和角色成员资格的访问特权)的继承。它不适用于CREATE ROLE
和ALTER 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 USER
与CREATE 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 标准指定的行为。