[TOC] #### 7.1.1.1 CREATE ROLE **说明** ~~~ CREATE ROLE role1; ~~~ 该语句创建一个无权限的角色,后续可以通过 GRANT 命令赋予该角色权限。 **示例** 创建一个角色: `CREATE ROLE role1;` #### 7.1.1.2 CREATE USER **说明** ~~~ CREATE USER user_identity [IDENTIFIED BY 'password'] [DEFAULT ROLE 'role_name']; user_identity: 'user_name'@'host' ~~~ CREATE USER命令用于创建一个 DorisDB 用户。在 DorisDB 中,一个user\_identity唯一标识一个用户。user\_identity由两部分组成,user\_name和host,其中user\_name为用户名。host标识用户端连接所在的主机地址。host部分可以使用 % 进行模糊匹配。如果不指定host,默认为 '%',即表示该用户可以从任意host连接到 DorisDB。 <br> 如果指定了角色(ROLE),则会自动将该角色所拥有的权限赋予新创建的这个用户。如果不指定,则该用户默认没有任何权限。指定的 ROLE 必须已经存在。 <br> **示例** * 创建一个无密码用户(不指定 host,则等价于 jack@'%')。 `CREATE USER 'jack';` * 创建一个有密码用户,允许从 '172.10.1.10' 登陆。 `CREATE USER jack@'172.10.1.10' IDENTIFIED BY '123456';` * 为了避免传递明文,上述示例也可以使用下面的方式来创建。 `CREATE USER jack@'172.10.1.10' IDENTIFIED BY PASSWORD  '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9';` 后面加密的内容可以通过PASSWORD()计算,例如: `SELECT PASSWORD('123456');` * 创建一个允许从 '192.168.\*.\*' 子网登陆的用户,同时指定其角色为 example\_role。 `CREATE USER 'jack'@'192.168.%' DEFAULT ROLE 'example_role';` * 创建一个允许从域名 'example\_domain' 登陆的用户。 `CREATE USER 'jack'@['example_domain'] IDENTIFIED BY '12345';` * 创建一个用户,并指定一个角色。 `CREATE USER 'jack'@'%' IDENTIFIED BY '12345' DEFAULT ROLE 'my_role';` <br> #### 7.1.1.3 DROP ROLE **说明** ~~~ DROP ROLE role1; ~~~ 该语句删除一个角色。删除一个角色不会影响之前属于该角色的用户的权限,仅相当于将该角色与用户解耦,而用户已经从该角色获取到的权限维持不变。 <br> **示例** 删除角色 role1: `DROP ROLE role1;` <br> #### 7.1.1.4 DROP USER **说明** ~~~ DROP USER 'user_identity'; `user_identity`: user@'host' user@['domain'] ~~~ 依据 user\_identity 删除用户帐号。 <br> **示例** 删除用户 jack@'192.%': `DROP USER 'jack'@'192.%';` <br> #### 7.1.1.5 GRANT **说明** GRANT 命令用于赋予指定用户或角色指定的权限。 ~~~ GRANT privilege_list ON db_name[.tbl_name] TO user_identity [ROLE role_name]; GRANT privilege_list ON RESOURCE resource_name TO user_identity [ROLE role_name]; ~~~ privilege\_list 是需要赋予的权限列表,以逗号分隔。当前 DorisDB 支持如下权限: * NODE\_PRIV:集群节点操作权限,包括节点上下线等操作,只有 root 用户有该权限,不可赋予其他用户。 * ADMIN\_PRIV:除 NODE\_PRIV 以外的所有权限。 * GRANT\_PRIV: 操作权限的权限。包括创建删除用户、角色,授权和撤权,设置密码等。 * SELECT\_PRIV:对指定的库或表的读取权限。 * LOAD\_PRIV:对指定的库或表的导入权限。 * ALTER\_PRIV:对指定的库或表的schema变更权限。 * CREATE\_PRIV:对指定的库或表的创建权限。 * DROP\_PRIV:对指定的库或表的删除权限。 * USAGE\_PRIV: 对指定资源的使用权限。 旧版权限中的 ALL 和 READ\_WRITE 会被转换成:SELECT\_PRIV, LOAD\_PRIV, ALTER\_PRIV, CREATE\_PRIV, DROP\_PRIV;READ\_ONLY 会被转换为 SELECT\_PRIV。 <br> 权限分类: * 节点权限:NODE\_PRIV * 库表权限:SELECT\_PRIV,LOAD\_PRIV,ALTER\_PRIV,CREATE\_PRIV,DROP\_PRIV * 资源权限:USAGE\_PRIV db\_name\[.tbl\_name\] 支持以下三种形式: * \*.\* 权限可以应用于所有库及其中所有表 * db.\* 权限可以应用于指定库下的所有表 * db.tbl 权限可以应用于指定库下的指定表 这里指定的库或表可以是不存在的库和表。 resource\_name 支持以下两种形式: (1) \* 权限应用于所有资源 (2) resource 权限应用于指定资源 <br> 这里指定的资源可以是不存在的资源。 user\_identity: 这里的 user\_identity 语法同 CREATE USER。且必须为使用 CREATE USER 创建过的 user\_identity。user\_identity 中的 host 可以是域名,如果是域名,权限的生效时间可能会有约1分钟的延迟。 <br> 也可以将权限赋予指定的 ROLE,如果指定的 ROLE 不存在,则会自动创建。 <br> **示例** * 授予所有库和表的权限给用户 `GRANT SELECT_PRIV ON *.* TO 'jack'@'%';` * 授予指定库表的权限给用户 `GRANT SELECT_PRIV,ALTER_PRIV,LOAD_PRIV ON db1.tbl1 TO 'jack'@'192.8.%';` * 授予指定库表的权限给角色 `GRANT LOAD_PRIV ON db1.* TO ROLE 'my_role';` * 授予所有资源的使用权限给用户 `GRANT USAGE_PRIV ON RESOURCE * TO 'jack'@'%';` * 授予指定资源的使用权限给用户 `GRANT USAGE_PRIV ON RESOURCE 'spark_resource' TO 'jack'@'%';` * 授予指定资源的使用权限给角色 `GRANT USAGE_PRIV ON RESOURCE 'spark_resource' TO ROLE 'my_role';` <br> #### 7.1.1.6 REVOKE **说明** REVOKE命令用于撤销指定用户或角色指定的权限。 ~~~ REVOKE privilege_list ON db_name[.tbl_name] FROM user_identity [ROLE role_name]; REVOKE privilege_list ON RESOURCE resource_name FROM user_identity [ROLE role_name]; ~~~ 这里的 user\_identity 语法同 CREATE USER,且必须为使用 CREATE USER 创建过的 user\_identity。user\_identity 中的 host 可以是域名,如果是域名,权限的撤销时间可能会有约1分钟的延迟。 <br> 按角色撤销权限时,要求 role\_name 指向已存在的角色。 <br> **示例** * 撤销用户 jack 关于数据库 db1 的权限。 `REVOKE SELECT_PRIV ON db1.* FROM 'jack'@'192.%';` * 撤销用户 jack 使用资源 spark\_resource 的权限。 `REVOKE USAGE_PRIV ON RESOURCE 'spark_resource' FROM 'jack'@'192.%';` <br> #### 7.1.1.7 SET PASSWORD **说明** ~~~ SET PASSWORD [FOR user_identity] = [PASSWORD('plain password')]|['hashed password']; ~~~ SET PASSWORD 命令可以用于修改一个用户的登录密码。如果 \[FOR user\_identity\] 字段不存在,那么修改当前用户的密码。 <br> 注意这里的 user\_identity 必须完全匹配在使用 CREATE USER 创建用户时指定的 user\_identity,否则会报错用户不存在。如果不指定 user\_identity,则当前用户为 'username'@'ip',这个当前用户,可能无法匹配任何 user\_identity。可以通过 SHOW GRANTS 查看当前用户。 <br> PASSWORD() 方式输入的是明文密码;而直接使用字符串,需要传递的是已加密的密码。 如果修改其他用户的密码,需要具有管理员权限。 SET PASSWORD 命令用于修改一个用户的登录密码。如果 \[FOR user\_identity\] 字段不存在,那么修改当前用户的密码。 > 注:user\_identity 必须完全匹配 CREATE USER 创建用户时指定的 user\_identity,否则会报告用户不存在的错误。可以通过 SHOW GRANTS 查看当前用户。修改其他用户密码时需要具有管理员权限。 PASSWORD()函数将明文密码转换为加密的密码。如果不使用PASSWORD()函数,则需要直接指定加密后的密码。 <br> **示例** * 修改当前用户的密码。 `SET PASSWORD = PASSWORD('123456') SET PASSWORD = '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9';` * 修改指定用户密码。 `SET PASSWORD FOR 'jack'@'192.%' = PASSWORD('123456') SET PASSWORD FOR 'jack'@['domain'] = '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9';` <br> #### 7.1.1.8 SET PROPERTY **说明** ~~~ SET PROPERTY [FOR 'user'] 'key' = 'value' [, 'key' = 'value']; ~~~ 设置用户的属性,如分配给用户的资源等。这里设置的用户属性,是针对 user 的,而不是 user\_identity。即假设通过 CREATE USER 语句创建了两个用户 'jack'@'%' 和 'jack'@'192.%',则使用 SET PROPERTY 语句,只能针对 jack 这个用户,而不是 'jack'@'%' 或 'jack'@'192.%' <br> key的取值包括: * 超级用户权限: * max\_user\_connections: 最大连接数。 * resource.cpu\_share: cpu资源分配。 * 普通用户权限: * quota.normal: normal级别的资源分配。 * quota.high: high级别的资源分配。 * quota.low: low级别的资源分配。 **示例** * 修改用户 jack 最大连接数为1000。 `SET PROPERTY FOR 'jack' 'max_user_connections' = '1000';` * 修改用户 jack 的cpu\_share为1000。 `SET PROPERTY FOR 'jack' 'resource.cpu_share' = '1000';` * 修改 jack 用户的normal组的权重。 `SET PROPERTY FOR 'jack' 'quota.normal' = '400';` * 为用户 jack 添加导入cluster。 `SET PROPERTY FOR 'jack'` `   'load_cluster.{cluster_name}.hadoop_palo_path' = '/user/palo/palo_path',` `   'load_cluster.{cluster_name}.hadoop_configs' = 'fs.default.name=hdfs://dpp.cluster.com:port;mapred.job.tracker=dpp.cluster.com:port;hadoop.job.ugi=user,password;mapred.job.queue.name=job_queue_name_in_hadoop;mapred.job.priority=HIGH;';` * 删除用户 jack 下的导入cluster。 `SET PROPERTY FOR 'jack' 'load_cluster.{cluster_name}' = '';` * 修改用户 jack 默认的导入cluster。 `SET PROPERTY FOR 'jack' 'default_load_cluster' = '{cluster_name}';` * 修改用户 jack 的集群优先级为 HIGH。 `SET PROPERTY FOR 'jack' 'load_cluster.{cluster_name}.priority' = 'HIGH';` <br> #### 7.1.1.9 SHOW GRANTS **说明** ~~~ SHOW [ALL] GRANTS [FOR user_identity]; ~~~ 该命令用于查看用户权限。 * SHOW ALL GRANTS 可以查看所有用户的权限。 * 如果指定 user\_identity,则查看该指定用户的权限,且该 user\_identity 必须为通过 CREATE USER 命令创建的。 * 如果不指定 user\_identity,则查看当前用户的权限。 **示例** * 查看所有用户权限信息 `SHOW ALL GRANTS;` * 查看指定 user 的权限 `SHOW GRANTS FOR jack@'%';` * 查看当前用户的权限 `SHOW GRANTS;` <br> #### 7.1.1.10 SHOW ROLES **说明** `SHOW ROLES;` 该命令用于展示所有已创建的角色信息,包括角色名称,包含的用户以及权限。 <br> **示例** 查看当前用户创建的角色。 `SHOW ROLES;`