CREATE ROLE

CREATE ROLE

定义一个新的数据库角色(用户或组)。

概要

CREATE ROLE name [[WITH] option [ ... ]]

其中option可以是:

      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | CREATEUSER | NOCREATEUSER
    | CREATEEXTTABLE | NOCREATEEXTTABLE 
      [ ( attribute='value'[, ...] ) ]
           where attributes and value are:
           type='readable'|'writable'
           protocol='gpfdist'|'http'
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | REPLICATION | NOREPLICATION
    | CONNECTION LIMIT connlimit
    | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'
    | VALID UNTIL 'timestamp' 
    | IN ROLE rolename [, ...]
    | ROLE rolename [, ...]
    | ADMIN rolename [, ...]
    | USER rolename [, ...]
    | SYSID uid [, ...]
    | RESOURCE QUEUE queue_name
    | RESOURCE GROUP group_name
    | [ DENY deny_point ]
    | [ DENY BETWEEN deny_point AND deny_point]

描述

CREATE ROLE在Greenplum数据库系统中添加了新角色。 角色是可以拥有数据库对象并具有数据库特权的实体。 根据角色的使用方式,可以将角色视为用户,组或两者。 您必须具有CREATEROLE特权或是数据库超级用户才能使用此命令。

请注意,角色是在系统级别定义的,并且对于Greenplum数据库系统中的所有数据库均有效。

参数

name
新角色的名称。
SUPERUSER
NOSUPERUSER
如果指定了SUPERUSER,则定义的角色将是超级用户,该超级用户可以覆盖数据库中的所有访问限制。 超级用户状态很危险,应仅在真正需要时使用。 您必须自己是超级用户才能创建新的超级用户。 默认值为NOSUPERUSER
CREATEDB
NOCREATEDB
如果指定了CREATEDB,将允许所定义的角色创建新数据库。 NOCREATEDB(默认值)将使角色无法创建数据库。
CREATEROLE
NOCREATEROLE
如果指定了CREATEROLE,则允许定义的角色创建新角色,更改其他角色和删除其他角色。 NOCREATEROLE(默认值)将拒绝角色创建新角色或修改其他角色。
CREATEUSER
NOCREATEUSER
这些子句已经过时,但仍然被SUPERUSERNOSUPERUSER的拼写接受。 请注意,它们不等同于CREATEROLENOCREATEROLE子句。
CREATEEXTTABLE
NOCREATEEXTTABLE
如果指定了CREATEEXTTABLE,则允许定义的角色创建外部表。 如果未指定,则默认typereadable,默认protocolgpfdist。 有效类型为gpfdistgpfdistshttphttpsNOCREATEEXTTABLE(默认类型)拒绝该角色创建外部表。 请注意,使用fileexecute协议的外部表只能由超级用户创建。
使用GRANT...ON PROTOCOL命令允许用户创建和使用具有自定义协议类型的外部表, 包括Greenplum数据库附带的s3pxf协议。
INHERIT
NOINHERIT
如果指定了该属性,则INHERIT(默认设置)允许该角色使用为其直接或间接所属的所有角色授予的任何数据库特权。 使用NOINHERIT时,另一个角色的成员资格仅授予SET ROLE权限给该另一个角色。
LOGIN
NOLOGIN
如果指定,则LOGIN允许角色登录数据库。 可以将具有LOGIN属性的角色视为用户。 具有NOLOGIN的角色对于管理数据库特权很有用,并且可以视为组。 如果未指定,则NOLOGIN为默认值, 除非CREATE ROLE通过其替代拼写CREATE USER被调用时。
REPLICATION
NOREPLICATION
这些子句确定是允许角色启动流复制还是使系统进入和退出备份模式。 具有REPLICATION属性的角色是具有很高特权的角色,并且仅应在实际用于复制的角色上使用。 如果未指定,则NOREPLICATION是默认值。
CONNECTION LIMIT connlimit
此角色可以建立的并发连接的最大数量。默认值-1表示没有限制。
PASSWORD password
使用LOGIN属性设置角色的用户密码。 如果您不打算使用密码身份验证,则可以忽略此选项。 如果未指定密码,则密码将设置为null,并且该用户的密码身份验证将始终失败。 空密码可以有选择地显式写为PASSWORD NULL
ENCRYPTED
UNENCRYPTED
这些关键字控制密码是否以加密方式存储在系统catalog中。 (如果未指定,则默认行为由配置参数password_encryption决定。) 如果显示的密码字符串已经采用MD5加密格式,则将按原样存储加密, 而不管是否指定了ENCRYPTEDUNENCRYPTED(因为系统无法解密指定的加密密码字符串)。 这允许在转储/还原期间重新加载加密的密码。
VALID UNTIL 'timestamp'
VALID UNTIL子句设置日期和时间,之后该角色的密码将不再有效。 如果省略此子句,密码将永不过期。
IN ROLE rolename
将新角色添加为命名角色的成员。 请注意,没有任何选项可以将新角色添加为管理员。 使用单独的GRANT命令来执行此操作。
ROLE rolename
将命名角色添加为该角色的成员,从而使该新角色成为一个组。
ADMIN rolename
ADMIN子句类似于ROLE, 但是被提及的角色被使用WITH ADMIN OPTION加入到新角色中, 从而赋予他们将这个角色的成员资格授予其他人的权利。
RESOURCE GROUP group_name
要分配给新角色的资源组的名称。 该角色将受限于资源组配置的并发事务,内存和CPU限制。 您可以将一个资源组分配给一个或多个角色。
如果未为新角色指定资源组,则会自动为该角色分配角色的默认资源组, 为SUPERUSER角色分配admin_group, 为非管理员角色分配default_group
您可以将admin_group资源组分配给具有SUPERUSER属性的任何角色。
您可以将default_group资源组分配给任何角色。
您不能将为外部组件创建的资源组分配给角色。
RESOURCE QUEUE queue_name
新用户级别角色将分配到的资源队列的名称。 只能将具有LOGIN特权的角色分配给资源队列。 特殊关键字NONE表示将角色分配给默认资源队列。 一个角色只能属于一个资源队列。
具有SUPERUSER属性的角色不受资源队列限制。 对于超级用户角色,无论分配的资源队列施加什么限制,查询总是立即运行。
DENY deny_point
DENY BETWEEN deny_point AND deny_point
DENYDENY BETWEEN关键字设置在登录时强制执行的基于时间的约束。 DENY设置拒绝访问的日期或日期和时间。 DENY BETWEEN设置一个拒绝访问的时间间隔。 两者都使用具有以下格式的参数deny_point
DAY day [ TIME 'time' ]
deny_point参数的两个部分使用以下格式:

对于day:

{'Sunday' | 'Monday' | 'Tuesday' |'Wednesday' | 'Thursday' | 'Friday' | 
'Saturday' | 0-6 }

对于time:

{ 00-23 : 00-59 | 01-12 : 00-59 { AM | PM }}
DENY BETWEEN子句使用两个deny_point参数:
DENY BETWEEN deny_point AND deny_point
有关基于时间的约束的更多信息和示例,请参阅Greenplum数据库管理员指南中的“管理角色和特权”。

注解

添加和删除角色成员(管理组)的首选方法是使用GRANTREVOKE

VALID UNTIL子句仅为密码而不是角色定义过期时间。 使用非基于密码的身份验证方法登录时,不会强制使用到期时间。

INHERIT属性控制可授予特权(数据库对象和角色成员的访问特权)的继承。 它不适用于由CREATE ROLEALTER ROLE设置的特殊角色属性。 例如,即使设置了INHERIT,具有CREATEDB特权的角色成员也不会立即授予创建数据库的能力。 这些特权/属性永远不会被继承: SUPERUSERCREATEDBCREATEROLECREATEEXTTABLELOGINRESOURCE GROUPRESOURCE QUEUE。 必须在每个用户级角色上设置属性。

由于向后兼容,INHERIT属性是默认属性。 在以前的Greenplum数据库版本中,用户始终可以访问其所属组的所有特权。 但是,NOINHERIT提供与SQL标准中指定的语义更接近的匹配。

使用CREATEROLE特权时要小心。 对于CREATEROLE-role的特权,没有继承的概念。 这意味着,即使一个角色没有特定的特权,但被允许创建其他角色, 它也可以轻松地创建另一个角色,而该角色的特权不同于其自己的角色(创建具有超级用户特权的角色除外)。 例如,如果角色具有CREATEROLE特权,但没有CREATEDB特权,则它可以使用CREATEDB特权创建新角色。 因此,将具有CREATEROLE特权的角色视为几乎超级用户角色。

超级用户绝不执行CONNECTION LIMIT选项。

使用此命令指定未加密的密码时必须小心。 密码将以明文形式传输到服务器,并且也可能会记录在客户端的命令历史记录或服务器日志中。 但是,客户端程序createuser传输加密的密码。 另外,psql包含命令\password,可用于稍后安全地更改密码。

示例

创建一个可以登录但不提供密码的角色:

CREATE ROLE jonathan LOGIN;

创建一个属于资源队列的角色:

CREATE ROLE jonathan LOGIN RESOURCE QUEUE poweruser;

使用有效期至2016年底的密码创建角色 (CREATE USERCREATE ROLE相同,只不过它暗含了LOGIN):

CREATE USER joelle WITH PASSWORD 'jw8s0F4' VALID UNTIL '2017-01-01';

创建一个可以创建数据库并管理其他角色的角色:

CREATE ROLE admin WITH CREATEDB CREATEROLE;

创建一个角色,该角色在星期日不允许登录访问:

CREATE ROLE user3 DENY DAY 'Sunday';

创建一个可以创建类型为'gpfdist'的可读可写外部表的角色:

CREATE ROLE jan WITH CREATEEXTTABLE(type='readable', protocol='gpfdist')
   CREATEEXTTABLE(type='writable', protocol='gpfdist'); 

创建一个角色,分配一个资源组:

CREATE ROLE bill RESOURCE GROUP rg_light;

兼容性

SQL标准定义了用户和角色的概念,但是将它们视为不同的概念,并将所有定义用户的命令留给数据库实现指定。 在Greenplum数据库中,用户和角色被统一为单一类型的对象。 因此,角色具有比标准中更多的可选属性。

CREATE ROLE在SQL标准中,但是该标准仅需要以下语法:

CREATE ROLE name [WITH ADMIN rolename]

Greenplum数据库扩展是允许多个初始管理员,以及CREATE ROLE的所有其他选项。

通过为用户提供NOINHERIT属性, 而为角色赋予INHERIT属性,可以最接近地逼近SQL标准指定的行为。