有奖捉虫:办公协同&微信生态&物联网文档专题 HOT

角色概述

在腾讯云数据仓库 TCHouse-P 中使用 roles 来对数据库的访问权限进行管理,角色(roles)的概念实际上包含了 users 与 groups 两部分,一个 role 可以是数据库普通用户,即 user,也可以是数据库的用户组,即 group。角色可以拥有数据库对象(例如表、视图等),并且可以将这些对象的访问权限分配给其他角色。
集群创建时,会提示用户设置初始用户名和密码,这个初始用户为“管理员用户”,该用户拥有创建用户、创建数据库、登录的权限。集群创建完成后,可以使用“管理员用户”连接数据库,一般地,管理员用户拥有最大化的权限,也意味着这个账号要被尽量少的人使用,因此您可以使用管理员用户创建其他用户,并为这些用户授予所需要的权限,具体授权参考 用户组对象权限管理。您也可以创建数据库以及其他对象,参考 定义数据库。登录数据库可以参考 连接数据库

创建用户

role 分为用户 user 和用户组 group,通常 user 级别的 role(后面统称 user)具有能够登录云数据仓库 PostgreSQL 数据库并初始化一个会话的权限,因此,在建立一个 user 时,必须为其赋予 LOGIN 的权限。例如:
CREATE role jsmith with LOGIN;
通过上述操作,创建了一个具有 LOGIN 权限的 user,通过这个 user,可以对数据库进行连接。云数据仓库 PostgreSQL 对用户的访问管理除了 LOGIN 权限外,还有以下其他权限,可以在使用 CREATE ROLE 语句创建角色时对其所能拥有的权限进行授权。
权限取值
作用
默认值
SUPERUSER Ι NOSUPERUSER
超级用户权限,只有超级用户才能创建其他的超级用户
NOSUPERUSER
CREATEDB Ι NOCREATEDB
创建数据库的权限
NOCREATEDB
CREATEROLE Ι NOCREATEROLE
创建和管理角色
NOCREATEROLE
INHERIT Ι NOINHERIT
决定了用户继承所属 group 的权限
INHERIT
LOGIN Ι NOLOGIN
连接登录数据库的权限,一般用户拥有该权限,用户组无该权限
NOLOGIN
CONNECTION LIMIT
限制能够并发连接数据库的连接数,-1表示无限制
-1
CREATEEXTTABLE Ι NOCREATEEXTTABLE
创建外表的权限
NOCREATEEXTTABLE
PASSWORD
创建用户时设置密码
VALID UNTIL 'timestamp'
密码的到期时间
RESOURCE QUEUE 'name'
用户连接后,建立的查询被安排到的资源队列名
pg_default
除了在创建用户时能够对其进行权限授予,还能在创建完成后通过 ALTER ROLE 语法对其进行权限的重新赋予。例如:
ALTER role jsmith with CREATEROLE;

用户组

group,即用户组,是一种特殊的 role,没有赋予 LOGIN 权限,group 通常被设定为经常搭配使用的权限组合,权限可以被作为一个整体授予给某个用户或者从某个用户处取消。
您可以通过使用以下语句来创建一个被授予权限组合的角色,即 group。
Create role, Create DB, Cannot login;
您还可以很方便地通过 GRANT TO 或者 REVOKE FROM 语句建立或者取消其他用户与该用户组的从属关系,拥有从属关系的用户会从这个用户组继承权限。
GRANT TO 语句示例:

用户 jsmith 归属于用户组 manager。
REVOKE FROM 语句示例:

将用户 jsmith 归属于用户组 manager 的关系取消。

对象权限管理

当一个对象(例如 database、table、schema、function 等)被创建时,必然会有一个归属者,这个归属者一般为执行创建对象语句的用户。初始时,只有归属者对这个对象拥有所有的操作权限。例如:
GRANT INSERT ON test TO jsmith;
我们可以通过上述语句,将 test 的 INSERT 权限授予 jsmith 用户,同样也可以通过 REVOKE FROM 取消。
同样,也可以通过 REASSIGN OWNED 语句将归属于某个用户的所有对象转移给别的用户,例如:
SET ROLE jsmith; //切换到jsmith用户
CREATE TABLE jsmithtest (age int, id int); //创建新的表
SET ROLE gpadmincloud; //切回到超级用户
reassign owned by jsmith to lambuser; //将归属于jsmith的对象都转移给lambuser。
由于归属于超级用户的对象不能转移给别的用户,因为有属于系统的对象归属于这个超级对象,因此我们需要使用非超级用户建立一个表。



完成对象从 jsmith 到 lambuser 归属权的转移。