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 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
命令修改。
将角色用作组时,添加和删除角色成员的首选方法是使用 GRANT
和 REVOKE
。
VALID UNTIL
子句仅定义密码的过期时间,而不是角色本身的过期时间。特别是,当使用非基于密码的身份验证方法登录时,不会强制执行过期时间。
此处定义的角色属性是不可继承的,例如,成为具有 CREATEDB
的角色的成员不会允许该成员创建新的数据库,即使成员资格授权具有 INHERIT
选项。当然,如果成员资格授权具有 SET
选项,则成员角色将能够 SET ROLE
到 createdb 角色,然后创建一个新的数据库。
由 IN ROLE
、ROLE
和 ADMIN
子句创建的成员资格授权将执行此命令的角色作为授予者。
出于向后兼容性的原因,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 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
[, ...]
如果您在文档中看到任何不正确、与特定功能的体验不符或需要进一步说明的内容,请使用 此表单 报告文档问题。