CREATE ROLE
CREATE ROLE - 定义新的数据库角色
语法格式
CREATE ROLE name [ [ WITH ] option [ ... ] ]
where option可以是:
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
说明
CREATE ROLE 为Vastbase E100数据库集群添加了一个新角色。角色是可以拥有数据库对象并具有数据库权限的实体;角色可以被视为”用户”,”组”或两者,具体取决于其使用方式。您必须具有CREATEROLE 权限或是数据库超级用户才能使用此命令。
请注意,角色是在数据库集群级别定义的,因此在集群中的所有数据库中都有效。
参数说明
name
新角色的名称。
SUPERUSER
NOSUPERUSER 这些子句决定新角色是否是一个“超级用户”,它可以越过数据库内的所有访问限制。超级用户状态很危险并且只应该在确实需要时才用。要创建一个新超级用户,你必须自己是一个超级用户。如果没有指定,默认值是NOSUPERUSER。
CREATEDB
NOCREATEDB 这些子句定义一个角色创建数据库的能力。如果指定了CREATEDB,被定义的角色将被允许创建新的数据库。指定NOCREATEDB将否定一个角色创建数据库的能力。如果没有指定,默认值是NOCREATEDB。
CREATEROLE
NOCREATEROLE 这些子句决定一个角色是否被允许创建新的角色(也就是执行CREATE ROLE)。一个带有CREATEROLE特权的角色也能修改和删除其他角色。如果没有指定,默认值是NOCREATEROLE。
INHERIT
NOINHERIT
如果新的角色是其他角色的成员,这些子句决定新角色是否从那些角色中“继承”特权,把新角色作为成员的角色称为新角色的父角色。一个带有INHERIT属性的角色能够自动使用已经被授予给其直接或间接父角色的任何数据库特权。如果没有INHERIT,在另一个角色中的成员关系只会把SET ROLE的能力授予给那个其他角色,只有在这样做后那个其他角色的特权才可用。如果没有指定,默认值是INHERIT。
LOGIN
NOLOGIN
这些子句决定一个角色是否被允许登录,也就是在客户端连接期间该角色是否能被给定为初始会话认证名称。一个具有LOGIN属性的角色可以被考虑为一个用户。没有这个属性的角色对于管理数据库特权很有用,但是却不是用户这个词的通常意义。如果没有指定,默认值是NOLOGIN,不过当CREATE ROLE被通过CREATE USER调用时默认值会是LOGIN。
REPLICATION
NOREPLICATION
这些子句决定一个角色是否为复制角色。角色必须具有这个属性(或者成为一个超级用户)才能以复制模式(物理复制或者逻辑复制)连接到服务器以及创建或者删除复制槽。一个具有REPLICATION属性的角色是一个具有非常高特权的角色,并且只应被用于确实需要复制的角色上。如果没有指定,默认值是NOREPLICATION。
BYPASSRLS
NOBYPASSRLS
这些子句决定是否一个角色可以绕过每一条行级安全性(RLS)策略。 默认是NOBYPASSRLS。注意 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子句列出一个或多个现有的角色,新角色将被立即作为新成员加入到这些角色中(注意没有选项可以把新角色作为一个管理员加入,需要用一个单独的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子句会被忽略,但是会为了向后兼容,还是会接受它。
注意事项
使用 ALTER ROLE更改角色的属性,使用 DROP ROLE删除角色。CREATE ROLE 指定的所有属性都可以由以后的 ALTER ROLE 命令修改。
添加和删除用作组的角色成员的首选方法是使用 GRANT和 REVOKE。
VALID UNTIL子句仅定义密码的到期时间,而不是角色本身。特别是,使用基于非密码的身份验证方法登录时,不会强制执行到期时间。
INHERIT属性控制可授予权限的继承(即,数据库对象和角色成员身份的访问权限)。它不适用于CREATE ROLE 和 ALTER ROLE 设置的特殊角色属性。例如,即使设置了 INHERIT,作为具有 CREATEDB权限的角色的成员也不会立即授予创建数据库的权限;在创建数据库之前,有必要通过SET ROLE成为该角色。
出于向后兼容性的原因, INHERIT 属性是默认属性:在Vastbase E100的早期版本中,用户始终可以访问其所属组的所有权限。但是, NOINHERIT提供了与SQL标准中指定的语义更接近的匹配。
要小心CREATEROLE特权。对于一个CREATEROLE角色的特权没有继承的概念。那意味着即使一个角色没有特定的特权但被允许创建其他角色,它可以轻易地创建与自身特权不同的另一个角色(除了创建具有超级用户特权的角色)。例如,如果角色“user”具有CREATEROLE特权但是没有CREATEDB特权,但是它能够创建一个带有CREATEDB特权的新角色。因此,可以把具有CREATEROLE特权的角色看成是准超级用户角色。
Vastbase E100包含一个程序 createuser,它具有和CREATE ROLE相同的功能(事实上,它调用此命令)但可以从命令shell运行。
CONNECTION LIMIT选项仅强制执行;如果两个新会话几乎在同一时间只为该角色保留一个连接”插槽”时启动,则两者都可能会失败。此外,超级用户永远不会强制执行此限制。
使用此命令指定未加密的密码时必须小心。密码将以明文形式传输到服务器,也可能记录在客户端的命令历史记录或服务器日志中。但是,命令createuser会传输加密的密码。此外, psql包含一个命令password ,可用于以后安全地更改密码。
示例
创建一个能登录但是没有口令的角色:
CREATE ROLE jonathan LOGIN;
使用密码创建角色:
CREATE USER davide WITH PASSWORD 'jw8s0F4';
( CREATE USER 与 CREATE ROLE 相同,但它隐含 LOGIN 。)
创建一个密码,该密码有效期至2024年底。在进入2025年第一秒时,密码不再有效。
CREATE ROLE miriam WITH LOGIN PASSWORD 'jw8s0F4' VALID UNTIL '2025-01-01';
创建可以创建数据库和管理角色的角色:
CREATE ROLE admin WITH CREATEDB CREATEROLE;