Postgresql 中文操作指南
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 数据库集群添加了一个新角色。角色是能够拥有数据库对象和具有数据库权限的实体;角色可以被视为“用户”、“组”,或两者,具体取决于其使用方式。有关管理用户和认证的信息,请参阅 Chapter 22 和 Chapter 21 。您必须拥有 CREATEROLE 权限或成为数据库超级用户才能使用此命令。
请注意,角色是在数据库集群级别定义的,因此在集群中的所有数据库中都有效。
在创建角色期间,可以立即将新创建的角色指定为现有角色的成员,还可以指定现有角色为新创建角色的成员。有资格获得哪些初始角色成员选项的规则在下面的 IN ROLE 、 ROLE 和 ADMIN 条款中进行了说明。 GRANT 命令在创建成员资格期间具有细粒度的选项控制,并在创建新角色后修改这些选项的能力。
Parameters
-
name
-
新角色的名称。
-
-
SUPERUSER__NOSUPERUSER
-
这些条款确定新角色是否为“超级用户”,它可以在数据库内覆盖所有访问限制。超级用户状态很危险,只应在真正需要时使用。您自己必须是超级用户才能创建新的超级用户。如果未指定,则 NOSUPERUSER 为默认值。
-
-
CREATEDB__NOCREATEDB
-
这些条款定义了角色创建数据库的能力。如果指定 CREATEDB ,则将允许正在定义的角色创建新数据库。指定 NOCREATEDB 将拒绝角色创建数据库的能力。如果未指定,则 NOCREATEDB 为默认值。只有超级用户角色或具有 CREATEDB 的角色才能指定 CREATEDB 。
-
-
CREATEROLE__NOCREATEROLE
-
这些条款确定是否允许角色创建、更改、删除、注释和更改其他角色的安全标签。有关此权限赋予哪些功能的更多详细信息,请参见 role creation 。如果未指定,则 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 属性的角色才需要密码,但您可以为没有密码的角色定义密码。)如果您不准备使用密码认证,则可以省略此选项。如果未指定密码,密码将被设为空值,并且该用户的密码认证将始终失败。可以用 PASSWORD NULL 明确地将空密码写入。
-
密码始终加密后存储在系统目录中。 ENCRYPTED 关键字无效,但向后兼容性接受。加密方法由配置参数 password_encryption 决定。如果提供的密码字符串已经采用 MD5 加密或 SCRAM 加密格式,那么无论 password_encryption 如何,都会按原样存储(因为系统无法解密指定的加密密码字符串,从而采用不同的格式进行加密)。这允许在转储/恢复期间重新加载已加密的密码。
-
-
VALID UNTIL 'timestamp'
-
VALID UNTIL 条款设置了一个日期和时间,在此之后角色的密码将不再有效。如果省略此条款,那么该密码将永久有效。
-
-
IN ROLE role_name
-
IN ROLE 子句导致新角色自动添加为指定现有角色的成员。新成员资格将启用 SET 选项并禁用 ADMIN 选项。除非指定了 NOINHERIT 选项,否则将启用 INHERIT 选项。
-
-
IN GROUP role_name
-
IN GROUP 是 IN ROLE 的过时拼写。
-
-
ROLE role_name
-
ROLE 子句导致一个或多个指定现有角色自动添加为成员,且 SET 选项已启用。这样实际上使新角色成为“组”。在该子句中以角色级别 INHERIT 特性命名的角色将在新成员资格中启用 INHERIT 选项。新成员资格将禁用 ADMIN 选项。
-
-
ADMIN role_name
-
ADMIN 子句与 ROLE 的效果相同,但命名的角色以启用 ADMIN 的方式添加为新角色的成员,赋予它们将新角色成员资格授予他人的权利。
-
-
USER role_name
-
USER 子句是 ROLE 子句的过时拼写。
-
-
SYSID uid
-
SYSID 子句被忽略,但为了向后兼容性而被接受。
-
Notes
使用 ALTER ROLE 更改角色的属性,使用 DROP ROLE 删除角色。 CREATE ROLE 指定的所有属性都可以由 ALTER ROLE 命令在后面进行修改。
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 ,该命令可用于在稍后安全地更改密码。
Examples
创建一个可以登录的角色,但不要给它一个密码:
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;
Compatibility
CREATE ROLE 语句在SQL标准中,但标准只要求语法。
CREATE ROLE name [ WITH ADMIN role_name ]
多个初始管理员和 CREATE ROLE 的其他选项是PostgreSQL扩展。
SQL标准定义了用户和角色的概念,但它把它们视为不同的概念并将定义用户的全部命令留给各数据库实现者决定。在PostgreSQL中,我们选择将用户和角色统一为单一实体。因此,角色有着比标准中更多的可选属性。
SQL标准指定的的行为最接近的是将SQL标准用户作为带有 NOINHERIT 选项的PostgreSQL角色和将SQL标准角色作为带有 INHERIT 选项的PostgreSQL角色来创建。
See Also
SET ROLE , ALTER ROLE , DROP ROLE , GRANT , REVOKE , createuser , createrole_self_grant