CREATE ROLE — 定义新的数据库角色
CREATE ROLEname
[ [ WITH ]option
[ ... ] ] whereoption
can be: SUPERUSER | NOSUPERUSER | CREATEDB | NOCREATEDB | CREATEROLE | NOCREATEROLE | INHERIT | NOINHERIT | LOGIN | NOLOGIN | REPLICATION | NOREPLICATION | BYPASSRLS | NOBYPASSRLS | CONNECTION LIMITconnlimit
| [ ENCRYPTED ] PASSWORD 'password
' | PASSWORD NULL | VALID UNTIL 'timestamp
' | IN ROLErole_name
[, ...] | ROLErole_name
[, ...] | ADMINrole_name
[, ...] | SYSIDuid
CREATE ROLE
在 PostgreSQL 数据库集群中添加一个新的角色。角色是一个可以拥有数据库对象并拥有数据库权限的实体;角色可以被认为是 “用户”、“组” 或两者兼而有之,具体取决于其使用方式。有关管理用户和身份验证的信息,请参阅第 21 章 和 第 20 章。您必须具有 CREATEROLE
权限或为数据库超级用户才能使用此命令。
请注意,角色是在数据库集群级别定义的,因此在集群中的所有数据库中都有效。
在角色创建过程中,可以立即将新创建的角色分配为现有角色的成员,并将现有角色分配为新创建的角色的成员。启用哪些初始角色成员资格选项的规则在下面的 IN ROLE
、ROLE
和 ADMIN
子句中进行了描述。 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 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,并且该用户的密码身份验证将始终失败。空密码可以可选地明确写为 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_name
ROLE
子句会导致将一个或多个指定的现有角色自动添加为成员,并启用 SET
选项。这实际上使新角色成为 “组”。在此子句中命名的具有角色级 INHERIT
属性的角色将在新的成员资格中启用 INHERIT
选项。新的成员资格将禁用 ADMIN
选项。
ADMIN
role_name
ADMIN
子句与 ROLE
的作用相同,但命名的角色作为新角色的成员添加,并启用了 ADMIN
,从而使他们有权将新角色的成员资格授予他人。
SYSID
uid
SYSID
子句被忽略,但为了向后兼容而接受。
使用 ALTER ROLE
更改角色的属性,并使用 DROP ROLE
删除角色。CREATE ROLE
指定的所有属性都可以通过以后的 ALTER ROLE
命令进行修改。
添加和删除用作组的角色成员的首选方法是使用 GRANT
和 REVOKE
。
只有VALID UNTIL
子句定义了密码的过期时间,而不是角色本身的过期时间。特别是,在使用非基于密码的身份验证方法登录时,不会强制执行过期时间。
此处定义的角色属性不可继承,即,成为具有例如CREATEDB
的角色的成员,即使成员资格授予具有INHERIT
选项,也不会允许该成员创建新数据库。当然,如果成员资格授予具有SET
选项,则成员角色将能够SET ROLE
到createdb角色,然后创建一个新数据库。
IN ROLE
、ROLE
和ADMIN
子句创建的成员资格授予以执行此命令的角色作为授予者。
INHERIT
属性是默认值,原因是向后兼容:在早期版本的PostgreSQL中,用户始终可以访问其所属组的所有权限。但是,NOINHERIT
更接近于SQL标准中指定的语义。
PostgreSQL包含一个程序createuser,它具有与CREATE ROLE
相同的功能(实际上,它调用此命令),但可以从命令行运行。
CONNECTION LIMIT
选项仅近似强制执行;如果两个新会话在只有一个连接“slot”剩余给角色时几乎同时启动,则两个会话都可能失败。此外,对于超级用户,永远不会强制执行此限制。
使用此命令指定未加密的密码时必须谨慎。密码将以明文形式传输到服务器,并且也可能记录在客户端的命令历史记录或服务器日志中。但是,createuser命令以加密方式传输密码。此外,psql包含一个命令\password
,可用于稍后安全地更改密码。
创建一个可以登录的角色,但不要为其分配密码
CREATE ROLE jonathan LOGIN;
创建一个带密码的角色
CREATE USER davide WITH PASSWORD 'jw8s0F4';
(CREATE USER
与CREATE 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 ROLEname
[ WITH ADMINrole_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
[, ...]
如果您在文档中发现任何不正确的内容、与您对特定功能的体验不符的内容或需要进一步澄清的内容,请使用此表单报告文档问题。