# CREATE USER
## description

Syntax:
    
    CREATE USER user_identity [IDENTIFIED BY 'password'] [DEFAULT ROLE 'role_name']

    user_identity:
        'user_name'@'host'
        
CREATE USER 命令用于创建一个 Palo 用户。在 Palo 中，一个 user_identity 唯一标识一个用户。user_identity 由两部分组成，user_name 和 host，其中 username 为用户名。host 标识用户端连接所在的主机地址。host 部分可以使用 % 进行模糊匹配。如果不指定 host，默认为 '%'，即表示该用户可以从任意 host 连接到 Palo。
    
host 部分也可指定为 domain，语法为：'user_name'@['domain']，即使用中括号包围，则 Palo 会认为这个是一个 domain，并尝试解析其 ip 地址。目前仅支持百度内部的 BNS 解析。
    
如果指定了角色（ROLE），则会自动将该角色所拥有的权限赋予新创建的这个用户。如果不指定，则该用户默认没有任何权限。指定的 ROLE 必须已经存在。

## example

1. 创建一个无密码用户（不指定 host，则等价于 jack@'%'）
   
    CREATE USER 'jack';

2. 创建一个有密码用户，允许从 '172.10.1.10' 登陆
   
    CREATE USER jack@'172.10.1.10' IDENTIFIED BY '123456';

3. 为了避免传递明文，用例2也可以使用下面的方式来创建
   
    CREATE USER jack@'172.10.1.10' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9';
   
    后面加密的内容可以通过PASSWORD()获得到,例如：
    
    SELECT PASSWORD('123456');

4. 创建一个允许从 '192.168' 子网登陆的用户，同时指定其角色为 example_role
   
    CREATE USER 'jack'@'192.168.%' DEFAULT ROLE 'example_role';
        
5. 创建一个允许从域名 'example_domain' 登陆的用户

    CREATE USER 'jack'@['example_domain'] IDENTIFIED BY '12345';

6. 创建一个用户，并指定一个角色

    CREATE USER 'jack'@'%' IDENTIFIED BY '12345' DEFAULT ROLE 'my_role';

## keyword
    CREATE, USER

# DROP USER
## description

Syntax:

    DROP USER 'user_name'

    DROP USER 命令会删除一个 palo 用户。这里 Palo 不支持删除指定的 user_identity。当删除一个指定用户后，该用户所对应的所有 user_identity 都会被删除。比如之前通过 CREATE USER 语句创建了 jack@'192.%' 以及 jack@['domain'] 两个用户，则在执行 DROP USER 'jack' 后，jack@'192.%' 以及 jack@['domain'] 都将被删除。

## example

1. 删除用户 jack
   
   DROP USER 'jack'

## keyword
    DROP, USER

# SET PASSWORD
## description

Syntax:

    SET PASSWORD [FOR user_identity] = 
    [PASSWORD('plain password')]|['hashed password']

    SET PASSWORD 命令可以用于修改一个用户的登录密码。如果 [FOR user_identity] 字段不存在，那么修改当前用户的密码。
    
    注意这里的 user_identity 必须完全匹配在使用 CREATE USER 创建用户时指定的 user_identity，否则会报错用户不存在。如果不指定 user_identity，则当前用户为 'username'@'ip'，这个当前用户，可能无法匹配任何 user_identity。可以通过 SHOW GRANTS 查看当前用户。
    
    PASSWORD() 方式输入的是明文密码; 而直接使用字符串，需要传递的是已加密的密码。
    如果修改其他用户的密码，需要具有管理员权限。

## example

1. 修改当前用户的密码
      
    SET PASSWORD = PASSWORD('123456')
    SET PASSWORD = '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'

2. 修改指定用户密码
   
    SET PASSWORD FOR 'jack'@'192.%' = PASSWORD('123456')
    SET PASSWORD FOR 'jack'@['domain'] = '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'

## keyword
    SET, PASSWORD

# GRANT
## description

GRANT 命令用于赋予指定用户或角色指定的权限。

Syntax:

    GRANT privilege_list ON db_name[.tbl_name] TO user_identity [ROLE role_name]


privilege_list 是需要赋予的权限列表，以逗号分隔。当前Palo支持如下权限：

    NODE_PRIV：集群节点操作权限，包括节点上下线等操作，只有 root 用户有该权限，不可赋予其他用户。
    ADMIN_PRIV：除 NODE_PRIV 以外的所有权限。
    SELECT_PRIV：对指定的库或表的读取权限
    LOAD_PRIV：对指定的库或表的导入权限
    ALTER_PRIV：对指定的库或表的schema变更权限
    CREATE_PRIV：对指定的库或表的创建权限
    DROP_PRIV：对指定的库或表的删除权限
    
    旧版权限中的 ALL 和 READ_WRITE 会被转换成：SELECT_PRIV,LOAD_PRIV,ALTER_PRIV,CREATE_PRIV,DROP_PRIV；
    READ_ONLY 会被转换为 SELECT_PRIV。

db_name[.tbl_name] 支持以下三种形式：

    1. *.* 权限可以应用于所有库及其中所有表
    2. db.* 权限可以应用于指定库下的所有表
    3. db.tbl 权限可以应用于指定库下的指定表

    这里指定的库或表可以是不存在的库和表。

user_identity：

    这里的 user_identity 语法同 CREATE USER。且必须为使用 CREATE USER 创建过的 user_identity。user_identity 中的host可以是域名，如果是域名的话，权限的生效时间可能会有1分钟左右的延迟。
    
    也可以将权限赋予指定的 ROLE，如果指定的 ROLE 不存在，则会自动创建。

## example

    1. 授予所有库和表的权限给用户
   
        GRANT SELECT_PRIV ON *.* TO 'jack'@'%';

    2. 授予指定库表的权限给用户

        GRANT SELECT_PRIV,ALTER_PRIVS,LOAD_PRIV ON db1.tbl1 TO 'jack'@'192.8.%';
        
    3. 授予指定库表的权限给角色

        GRANT LOAD_PRIV ON db1.* TO ROLE my_role;

## keyword
   GRANT
   
# REVOKE
## description

    REVOKE 命令用于撤销指定用户或角色指定的权限。
    Syntax：
        REVOKE privilege_list ON db_name[.tbl_name] FROM user_identity [ROLE role_name]
        
    user_identity：

    这里的 user_identity 语法同 CREATE USER。且必须为使用 CREATE USER 创建过的 user_identity。user_identity 中的host可以是域名，如果是域名的话，权限的撤销时间可能会有1分钟左右的延迟。
    
    也可以撤销指定的 ROLE 的权限，执行的 ROLE 必须存在。
        
## example

    1. 撤销用户 jack 数据库 testDb 的权限
   
        REVOKE SELECT_PRIV ON db1.* FROM 'jack'@'192.%';

## keyword

    REVOKE

# SET PROPERTY
## description

   Syntax:

    SET PROPERTY [FOR 'user'] 'key' = 'value' [, 'key' = 'value']

    设置用户的属性，包括分配给用户的资源、导入cluster等。这里设置的用户属性，是针对 user 的，而不是 user_identity。即假设通过 CREATE USER 语句创建了两个用户 'jack'@'%' 和 'jack'@'192.%'，则使用 SET PROPERTY 语句，只能针对 jack 这个用户，而不是 'jack'@'%' 或 'jack'@'192.%'

    导入 cluster 仅适用于百度内部用户。

   key:
   
    超级用户权限:
        max_user_connections: 最大连接数。
        resource.cpu_share: cpu资源分配。
        load_cluster.{cluster_name}.priority: 为指定的cluster分配优先级，可以为 HIGH 或 NORMAL

    普通用户权限：
        quota.normal: normal级别的资源分配。
        quota.high: high级别的资源分配。
        quota.low: low级别的资源分配。

        load_cluster.{cluster_name}.hadoop_palo_path: palo使用的hadoop目录，需要存放etl程序及etl生成的中间数据供palo导入。导入完成后会自动清理中间数据，etl程序自动保留下次使用。    
        load_cluster.{cluster_name}.hadoop_configs: hadoop的配置，其中fs.default.name、mapred.job.tracker、hadoop.job.ugi必须填写。
        load_cluster.{cluster_name}.hadoop_http_port: hadoop hdfs name node http端口。其中 hdfs 默认为8070，afs 默认 8010。
        default_load_cluster: 默认的导入cluster。

## example

    1. 修改用户 jack 最大连接数为1000
    SET PROPERTY FOR 'jack' 'max_user_connections' = '1000';

    2. 修改用户 jack 的cpu_share为1000
    SET PROPERTY FOR 'jack' 'resource.cpu_share' = '1000';

    3. 修改 jack 用户的normal组的权重
    SET PROPERTY FOR 'jack' 'quota.normal' = '400';

    4. 为用户 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;';

    5. 删除用户 jack 下的导入cluster。
    SET PROPERTY FOR 'jack' 'load_cluster.{cluster_name}' = '';

    6. 修改用户 jack 默认的导入cluster
    SET PROPERTY FOR 'jack' 'default_load_cluster' = '{cluster_name}';
    
    7. 修改用户 jack 的集群优先级为 HIGH
    SET PROPERTY FOR 'jack' 'load_cluster.{cluster_name}.priority' = 'HIGH';

## keyword
    SET, PROPERTY
    
# CREATE ROLE

## description
    该语句用户创建一个角色
    
    语法：
        CREATE ROLE role1;
        
    该语句创建一个无权限的角色，可以后续通过 GRANT 命令赋予该角色权限。
    
## example

    1. 创建一个角色
   
        CREATE ROLE role1;
        
## keyword
   CREATE, ROLE
   
   
# DROP ROLE

## description
    该语句用户删除一个角色
    
    语法：
        DROP ROLE role1;
        
    删除一个角色，不会影响之前属于该角色的用户的权限。仅相当于将该角色与用户解耦。用户已经从该角色中获取到的权限，不会改变。
    
## example

    1. 删除一个角色
   
        DROP ROLE role1;
        
## keyword
   DROP, ROLE     

# SHOW ROLES

## description
    该语句用于展示所有已创建的角色信息，包括角色名称，包含的用户以及权限。

    语法：
        SHOW ROLES;

## example

    1. 查看已创建的角色：

        SHOW ROELS;

## keyword
    SHOW,ROLES

## description
    该语句用户删除一个角色
    
    语法：
        DROP ROLE role1;
        
    删除一个角色，不会影响之前属于该角色的用户的权限。仅相当于将该角色与用户解耦。用户已经从该角色中获取到的权限，不会改变。
    
## example

    1. 删除一个角色
   
        DROP ROLE role1;
        
## keyword
   DROP, ROLE     

# SHOW GRANTS

## description
    
    该语句用于查看用户权限。
    
    语法：
        SHOW [ALL] GRANTS [FOR user_identity];
        
    说明：
        1. SHOW ALL GRANTS 可以查看所有用户的权限。
        2. 如果指定 user_identity，则查看该指定用户的权限。且该 user_identity 必须为通过 CREATE USER 命令创建的。
        3. 如果不指定 user_identity，则查看当前用户的权限。
    
        
## example

    1. 查看所有用户权限信息
   
        SHOW ALL GRANTS;
        
    2. 查看指定 user 的权限

        SHOW GRANTS FOR jack@'%';
        
    3. 查看当前用户的权限

        SHOW GRANTS;

## keyword
   SHOW, GRANTS
