
# 权限管理
#### 权限级别支持情况
- 用户层级（支持）
- 数据库层级（支持）
- 表层级（支持）
- 列层级（暂不支持）
- 子程序层级（暂不支持）
- 全局层级（暂不支持）
 
#### 权限项
DDM通过GRANT语句授权所支持的权限项如下：
| 权限类型        | 权限简述       |
|:---|:---|
| ALL         | 所有权限       |
| Drop        | 删除table    |
| Index       | 创建/删除index |
| Alter       | 执行ALTER语句  |
| Create      | 创建table    |
| Select      | 读取表内容      |
| Insert      | 插入数据到表     |
| Update      | 更新表中数据     |
| Grant       | 授予用户权限     |
| Revoke      | 删除用户权限     |
| Set         | SET用户密码权限  |
| File        | 从文件加载数据库权限 |
| Create User | 创建用户       |
   
#### 注意事项
- DDM账号的基础权限base_authority只能通过控制台界面来修改，通过数据库客户端访问DDM下发GRANT命令授予的权限无法在控制台界面上体现。
- DDM账号拥有逻辑库的任意表级权限或者库级权限，控制台界面就会展示已关联该逻辑库。
- Create user只支持用户级权限。
- 删除逻辑库，删除表不会影响DDM账号的grant info权限信息。
- 用grant语法授权给DDM账号，命令如下所示：
  ```
  grant grant option on {用户级、库级别、表级别} to DDM账号
  ```
  
- 创建的DDM账号必须关联逻辑库才会给该账号赋权。
 
#### 权限操作
![](https://support.huaweicloud.com/usermanual-ddm/public_sys-resources/notice_3.0-zh-cn.png)
除show grants命令需要3.0.2及以上版本外，其他功能需要2.4.1.4及以上版本。
**创建账号（CREATE USER）语句**
语法规则：
```
CREATE USER username IDENTIFIED BY 'password'
```
示例：**创建一个名为Jenny，密码为xxxxxx。**
```
CREATE USER Jenny IDENTIFIED BY 'xxxxxx';
```
![](https://support.huaweicloud.com/usermanual-ddm/public_sys-resources/note_3.0-zh-cn.png)
用户名和密码需要满足对应规则。
**删除账号（DROP USER）语句**
语法规则：
```
DROP USER username
```
示例：**移除账号** Jenny**。**
```
DROP USER Jenny;
```
**修改账号密码（SET PASSWORD）语句**
语法规则：
```
SET PASSWORD FOR 'username'@'%' = 'auth_string'
```
![](https://support.huaweicloud.com/usermanual-ddm/public_sys-resources/note_3.0-zh-cn.png)
为了兼容MySQL语法用户需要统一写成'username'@'%'格式。
示例：**修改账号** Jenny**的密码为xxxxxx**
```
SET PASSWORD FOR 'Jenny'@'%' = 'xxxxxx'
```
**授权权限（GRANT）语句**
语法规则：
```
GRANT    
   priv_type[, priv_type] ...     
   ON priv_level     
   TO user [auth_option] 
   priv_level: {    
       | *.*    
       | db_name.*    
       | db_name.tbl_name      
       | tbl_name}
   auth_option: {        
       IDENTIFIED BY 'auth#string'
}
```
![](https://support.huaweicloud.com/usermanual-ddm/public_sys-resources/note_3.0-zh-cn.png)
GRANT 语句里面的账号如果不存在，同时又没有提供 IDENTIFIED BY 信息，则报账号不存在异常；如果提供了 IDENTIFIED BY 信息，则会创建该账号同时授权。
当前支持使用GRANT ALL \[PRIVILEGES\]语法授权表级、用户级以及库级所有权限。
示例1：创建一个**用户级**所有权限的账号。用户名为Mike。
方法1：先创建账号，再授权。
```
CREATE USER Mike IDENTIFIED BY 'password';
GRANT SELECT, INSERT ON *.* to Mike;
```
方法2：一条语句完成创建账号和授权两个操作。
```
GRANT SELECT, INSERT ON *.* to Mike IDENTIFIED BY 'password';
```
示例2：创建一个**数据库级**所有权限的账号。在数据库 testdb 下面，创建一个用户名为 david，具有 testdb 数据库SELECT权限的账号。
方法1：先创建账号，再授权。
```
CREATE USER david IDENTIFIED BY 'password';
GRANT SELECT ON testdb.* to david;
```
方法2：一条语句完成创建账号和授权两个操作。
```
GRANT SELECT ON testdb.* to david IDENTIFIED BY 'password';
```
示例3：创建一个**表级别**所有权限的账号。在数据库 testdb 下面，创建一个用户名为 hanson，具有 testdb.employees 表所有权限的账号。
```
GRANT  ALL PRIVILEGES ON testdb.employees to hanson IDENTIFIED BY 'password';
```
**回收权限（REVOKE）语句**
语法规则：
```
REVOKE    
    priv_type [, priv_type] ...   
    ON priv_level FROM user;
```
示例：删除 hanson在 testdb.emp 表的 CREATE、DROP、INDEX 权限。
```
REVOKE CREATE,DROP,INDEX ON testdb.emp FROM hanson;
```
![](https://support.huaweicloud.com/usermanual-ddm/public_sys-resources/note_3.0-zh-cn.png)
删除账号在某个权限级别下的权限项，具体权限级别由 priv_level 指定。
**查看授权（SHOW GRANTS）语句**
语法规则：
```
SHOW GRANTS FOR user;
```
示例1：查看当前用户权限可以使用以下三种方式之一：
```
SHOW GRANTS;
SHOW GRANTS FOR CURRENT_USER;
SHOW GRANTS FOR CURRENT_USER();
```
示例2：查看其他用户权限，只有当前用户具有**用户级GRANT权限**时才可使用此操作。
```
mysql> show grants for david;
+-----------------------------+
|Grants for david            |
+-----------------------------+
|GRANT USAGE ON *.* TO david |
+-----------------------------+
1 row in set (0.00 sec)
```
