# 用户与权限
#### 概述
在M-Compatibility中，用户与权限管控相关的行为、语法整体沿用GaussDB的机制，暂不同步MySQL。
用户与权限的行为与GaussDB保持一致，具体行为说明请参见《开发指南》中"数据库安全 \> 用户及权限"章节。
用户与权限的语法在原有GaussDB的基础上，裁剪了部分语法，具体语法说明请参见《M-Compatibility开发指南》中" SQL参考 \> SQL语法 \> SQL语句"章节。M-Compatibility与GaussDB的语法差异请参见[表1]。
 表1M-Compatibility与GaussDB的语法差异 
| 语法说明                    | 概述                                          | M-Compatibility与GaussDB的差异                                                                                                                                                                                       |
|:---|:---|:---|
| CREATE ROLE               | 创建一个角色。                                    | 在M-Compatibility中，不支持指定涉及以下关键字的选项：ENCRYPTED、UNENCRYPTED、RESOURCE POOL、PERM SPACE、TEMP SPACE、SPILL SPACE。 在M-Compatibility中，创建USER时会自动创建与USER同名的Schema，MySQL不创建。 |
| CREATE USER                 | 创建一个用户。                                    | 在M-Compatibility中，不支持指定涉及以下关键字的选项：ENCRYPTED、UNENCRYPTED、RESOURCE POOL、PERM SPACE、TEMP SPACE、SPILL SPACE。 在M-Compatibility中，创建USER时会自动创建与USER同名的Schema，MySQL不创建。 |
| CREATE GROUP            | 创建一个新用户组。CREATE GROUP是CREATE ROLE的别名，不推荐使用。 | 在M-Compatibility中，不支持指定涉及以下关键字的选项：ENCRYPTED、UNENCRYPTED、RESOURCE POOL、PERM SPACE、TEMP SPACE、SPILL SPACE。 在M-Compatibility中，创建USER时会自动创建与USER同名的Schema，MySQL不创建。 |
| ALTER ROLE               | 修改角色属性。                                  | 在M-Compatibility中，不支持指定涉及以下关键字的选项：ENCRYPTED、UNENCRYPTED、RESOURCE POOL、PERM SPACE、TEMP SPACE、SPILL SPACE。 在M-Compatibility中，创建USER时会自动创建与USER同名的Schema，MySQL不创建。 |
| ALTER USER                 | 修改用户属性。                                    | 在M-Compatibility中，不支持指定涉及以下关键字的选项：ENCRYPTED、UNENCRYPTED、RESOURCE POOL、PERM SPACE、TEMP SPACE、SPILL SPACE。 在M-Compatibility中，创建USER时会自动创建与USER同名的Schema，MySQL不创建。 |
| ALTER GROUP              | 修改一个用户组的属性。                              | -                                                                                                                                                                                                                 |
| DROP ROLE                | 删除角色。                                      | -                                                                                                                                                                                                                |
| DROP USER                | 删除用户。                                      | -                                                                                                                                                                                                                |
| DROP GROUP               | 删除用户组。                                     | -                                                                                                                                                                                                                |
| DROP OWNED                 | 删除一个数据库角色所拥有的数据库对象。                       | -                                                                                                                                                                                                                |
| REASSIGN OWNED           | 修改数据库对象的属主。                               | M-Compatibility中不支持该语法。                                                                                                                                                                                          |
| GRANT                     | 对角色和用户进行授权操作。                             | M-Compatibility中不支持授予或回收函数、存储过程、表空间、DATABASE LINK等对象的权限。                                                                                                                                                   |
| REVOKE                    | 用于撤销一个或多个角色的权限。                            | M-Compatibility中不支持授予或回收函数、存储过程、表空间、DATABASE LINK等对象的权限。                                                                                                                                                   |
| ALTER DEFAULT PRIVILEGES | 设置应用于将来创建的对象的权限（这不会影响分配到已有对象中的权限）。         | M-Compatibility中不支持函数，类型，密态数据库客户端主密钥和列加密密钥的权限更改。                                                                                                                                                                |
   
#### 差异说明
- 语法格式差异 M-Compatibility的授权语法请参见《M-Compatibility开发指南》中"SQL参考 \> SQL语法 \> SQL语句 \> G \> GRANT"章节，MySQL中的授权语法如下：
  ```
  -- 全局级、数据库级、表级、存储过程级赋权语法
  GRANT
       priv_type [(column_list)]
         [, priv_type [(column_list)]] ...
       ON [object_type] priv_level
       TO user [auth_option] [, user [auth_option]] ...
       [REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
       [WITH {GRANT OPTION | resource_option} ...]
   
  -- 用户代理赋权语法
  GRANT PROXY ON user
       TO user [, user] ...
       [WITH GRANT OPTION]
   
  object_type: {
       TABLE
    | FUNCTION
    | PROCEDURE
  }
   
  priv_level: {
       *
    | *.*
    | db_name.*
    | db_name.tbl_name
    | tbl_name
    | db_name.routine_name
  }
   
  user:
       'user_name'@'host_name'
   
  auth_option: {
       IDENTIFIED BY 'auth_string'
    | IDENTIFIED WITH auth_plugin
    | IDENTIFIED WITH auth_plugin BY 'auth_string'
    | IDENTIFIED WITH auth_plugin AS 'auth_string'
    | IDENTIFIED BY PASSWORD 'auth_string'
  }
   
  tls_option: {
       SSL
    | X509
    | CIPHER 'cipher'
    | ISSUER 'issuer'
    | SUBJECT 'subject'
  }
   
  resource_option: {
    | MAX_QUERIES_PER_HOUR count
    | MAX_UPDATES_PER_HOUR count
    | MAX_CONNECTIONS_PER_HOUR count
    | MAX_USER_CONNECTIONS count
  }
  ```
  

- 赋权类型差异
  MySQL支持的赋权类型如下：
  表2MySQL支持的赋权类型 
  | 权限类型                                                                                                                        | 释义及权限级别                                                                                                                                                                                                                                                                                                                                                                                                  |
  |:---|:---|
  | [ALL \[PRIVILEGES\]](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_all)                             | 授予指定访问级别的所有权限，除了[GRANT OPTION](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_grant-option)和[PROXY](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_proxy)。                                                                                                                                                                                                |
  | [ALTER](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_alter)                                        | 启用[ALTER TABLE](https://dev.mysql.com/doc/refman/5.7/en/alter-table.html)。级别：全局、数据库、表。                                                                                                                                                                                                                                                                                                                   |
  | [ALTER ROUTINE](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_alter-routine)                       | 允许更改或删除存储过程。级别：全局、数据库、例程。                                                                                                                                                                                                                                                                                                                                                                                  |
  | [CREATE](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_create)                                      | 启用数据库和表创建。级别：全局、数据库、表。                                                                                                                                                                                                                                                                                                                                                                                    |
  | [CREATE ROUTINE](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_create-routine)                      | 启用存储过程创建。级别：全局、数据库。                                                                                                                                                                                                                                                                                                                                                                                     |
  | [CREATE TABLESPACE](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_create-tablespace)               | 允许创建、更改或删除表空间和日志文件组。级别：全局。                                                                                                                                                                                                                                                                                                                                                                              |
  | [CREATE TEMPORARY TABLES](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_create-temporary-tables) | 启用[CREATE TEMPORARY TABLE](https://dev.mysql.com/doc/refman/5.7/en/create-table.html)。级别：全局、数据库。                                                                                                                                                                                                                                                                                                        |
  | [CREATE USER](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_create-user)                           | 启用[CREATE USER](https://dev.mysql.com/doc/refman/5.7/en/create-user.html)、[DROP USER](https://dev.mysql.com/doc/refman/5.7/en/drop-user.html)、[RENAME USER](https://dev.mysql.com/doc/refman/5.7/en/rename-user.html)和[REVOKE ALL PRIVILEGES](https://dev.mysql.com/doc/refman/5.7/en/revoke.html)。级别：全局。                                                                                               |
  | [CREATE VIEW](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_create-view)                          | 允许创建或更改视图。级别：全局、数据库、表。                                                                                                                                                                                                                                                                                                                                                                                  |
  | [DELETE](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_delete)                                     | 启用[DELETE](https://dev.mysql.com/doc/refman/5.7/en/delete.html)。级别：全局、数据库、表。                                                                                                                                                                                                                                                                                                                              |
  | [DROP](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_drop)                                         | 允许删除数据库、表和视图。级别：全局、数据库、表。                                                                                                                                                                                                                                                                                                                                                                                 |
  | [EVENT](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_event)                                       | 启用定时任务。级别：全局、数据库。                                                                                                                                                                                                                                                                                                                                                                                       |
  | [EXECUTE](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_execute)                                   | 使用户能够执行存储过程。级别：全局、数据库、存储过程。                                                                                                                                                                                                                                                                                                                                                                              |
  | [FILE](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_file)                                         | 使用户能够使服务器读取或写入文件。级别：全局。                                                                                                                                                                                                                                                                                                                                                                                    |
  | [GRANT OPTION](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_grant-option)                          | 允许向其他账户授予权限或从其他账户删除权限。级别：全局、数据库、表、存储过程、代理。                                                                                                                                                                                                                                                                                                                                                              |
  | [INDEX](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_index)                                        | 允许创建或删除索引。级别：全局、数据库、表。                                                                                                                                                                                                                                                                                                                                                                                  |
  | [INSERT](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_insert)                                      | 启用[INSERT](https://dev.mysql.com/doc/refman/5.7/en/insert.html)。级别：全局、数据库、表、列。                                                                                                                                                                                                                                                                                                                         |
  | [LOCK TABLES](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_lock-tables)                            | 在具有SELECT权限的表上启用LOCK TABLES。级别：全局、数据库。                                                                                                                                                                                                                                                                                                                                                                 |
  | [PROCESS](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_process)                                   | 使用户能够通过[SHOW PROCESSLIST](https://dev.mysql.com/doc/refman/5.7/en/show-processlist.html)查看所有正在运行的线程。级别：全局。                                                                                                                                                                                                                                                                                                 |
  | [PROXY](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_proxy)                                        | 启用用户代理。级别：从用户到用户。                                                                                                                                                                                                                                                                                                                                                                                        |
  | [REFERENCES](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_references)                             | 启用外键创建。级别：全局、数据库、表、列。                                                                                                                                                                                                                                                                                                                                                                                      |
  | [RELOAD](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_reload)                                     | 启用[FLUSH](https://dev.mysql.com/doc/refman/5.7/en/flush.html)操作的使用。级别：全局。                                                                                                                                                                                                                                                                                                                              |
  | [REPLICATION CLIENT](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_replication-client)             | 使用户能够查询源服务器或副本服务器的位置。级别：全局。                                                                                                                                                                                                                                                                                                                                                                               |
  | [REPLICATION SLAVE](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_replication-slave)               | 允许副本从源读取二进制日志。级别：全局。                                                                                                                                                                                                                                                                                                                                                                                     |
  | [SELECT](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_select)                                       | 启用使用[SELECT](https://dev.mysql.com/doc/refman/5.7/en/select.html)。级别：全局、数据库、表、列。                                                                                                                                                                                                                                                                                                                        |
  | [SHOW DATABASES](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_show-databases)                    | 启用[SHOW DATABASES](https://dev.mysql.com/doc/refman/5.7/en/show-databases.html)以显示所有数据库。级别：全局。                                                                                                                                                                                                                                                                                                          |
  | [SHOW VIEW](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_show-view)                               | 启用[SHOW CREATE VIEW](https://dev.mysql.com/doc/refman/5.7/en/show-create-view.html)。级别：全局、数据库、表。                                                                                                                                                                                                                                                                                                        |
  | [SHUTDOWN](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_shutdown)                                | [启用mysqladmin shutdown](https://dev.mysql.com/doc/refman/5.7/en/mysqladmin.html)的使用。级别：全局。                                                                                                                                                                                                                                                                                                              |
  | [SUPER](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_super)                                      | 启用其他管理操作，例如[CHANGE MASTER TO](https://dev.mysql.com/doc/refman/5.7/en/change-master-to.html)、[KILL](https://dev.mysql.com/doc/refman/5.7/en/kill.html)、[PURGE BINARY LOGS](https://dev.mysql.com/doc/refman/5.7/en/purge-binary-logs.html)、[SET GLOBAL](https://dev.mysql.com/doc/refman/5.7/en/set-variable.html)和[mysqladmin debug](https://dev.mysql.com/doc/refman/5.7/en/mysqladmin.html)命令。级别：全局。 |
  | [TRIGGER](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_trigger)                                 | 启用触发器操作。级别：全局、数据库、表。                                                                                                                                                                                                                                                                                                                                                                                     |
  | [UPDATE](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_update)                                     | 启用[UPDATE](https://dev.mysql.com/doc/refman/5.7/en/update.html)。级别：全局、数据库、表、列。                                                                                                                                                                                                                                                                                                                           |
  | [USAGE](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_usage)                                       | 等价于"没有特权"。                                                                                                                                                                                                                                                                                                                                                                                              |
     
  M-Compatibility以级别划分支持以下权限：
  表3M-Compatibility支持的赋权类型 
  | 授权对象    | 支持授予的权限                                                                              |
  |:---|:---|
  | 数据库 | CREATE、CONNECT、TEMPORARY、TEMP、ALTER、DROP、COMMENT                                     |
  | 模式     | CREATE、USAGE、ALTER、DROP、COMMENT                                                        |
  | 表、视图  | SELECT、INSERT、UPDATE、DELETE、TRUNCATE、REFERENCES、TRIGGER、ALTER、DROP、COMMENT、INDEX、VACUUM |
  | 列       | SELECT、INSERT、UPDATE、REFERENCES、COMMENT                                                 |
  | 序列     | SELECT、USAGE、UPDATE、ALTER、DROP、COMMENT                                                |
     
  
- MySQL通过'\*.\*'表示全局层级的授权对象；GaussDB通过'{DATABASE} db_name'表示数据库层级的授权对象。GaussDB的数据库层级对应MySQL的全局层级。
- MySQL通过'schema_name.\*'表示数据库/模式层级的授权对象；GaussDB通过'{SCHEMA} schema_name'表示模式层级的授权对象。GaussDB的模式层级对应MySQL的数据库/模式层级。
- MySQL中用户名为两部分：用户名@主机名；M-Compatibility当前仅支持用户名。
- MySQL支持在GRANT赋权语法中修改用户验证，安全连接，资源参数属性，即auth_option、tls_option和resource option；M-Compatibility赋权语法中不支持以上特性，需使用CREATE USER、ALTER USER设置用户相关属性。
- MySQL支持用户代理赋权，GRANT PROXY ON主要用于对多个用户进行统一的权限管理。MySQL 5.7未提供角色机制，而在MySQL 8.0和M-Compatibility中都提供了角色机制。角色能满足用户对于多个用户权限统一管控的目标，可以替代GRANT PROXY ON。
- M-Compatibility拥有public的概念，所用用户都拥有public的权限，部分系统表、系统视图可供所有用户查询。用户可以对public所拥有的权限进行grant和revoke；MySQL中，新创建的用户只拥有全局的usage权限，这个权限很小，几乎为0，只有连接数据库和查询information_schema数据库的权限。
- M-Compatibility中，对象的所有者缺省具有该对象上的所有权限，出于安全考虑所有者可以舍弃部分权限，但ALTER、DROP、COMMENT、INDEX、VACUUM以及对象的可再授予权限属于所有者固有的权限，隐式拥有，无法回收；MySQL中，没有owner的概念，即使用户创建了表，如果没赋予用户对应权限，那么用户也不能对其创建的表进行IUD等操作。
- 在MySQL中，USAGE实际上表示无权限，所用用户都拥有该权限，当执行revoke或grant usage时，实际上不会进行任何修改；在M-Compatibility中，USAGE权限如下：
  - 对于模式，USAGE允许访问包含在指定模式中的对象，若没有该权限，则只能看到这些对象的名称。
  
  - 对于序列，USAGE允许使用nextval函数。
   
- 在M-Compatibility中，支持给用户设置管理员角色，包括系统管理员（SYSADMIN）、安全管理员（CREATEROLE）、审计管理员（AUDITADMIN）、监控管理员（MONADMIN）、运维管理员（OPRADMIN）、安全策略管理员（POLADMIN）。默认情况下拥有SYSADMIN属性的系统管理员，具备系统最高权限。三权分立后，系统管理员将不再具有CREATEROLE属性（安全管理员）和AUDITADMIN属性（审计管理员）能力，即不再拥有创建角色和用户的权限，也不再拥有查看和维护数据库审计日志的权限；在MySQL中，不支持该用户设置管理员角色，也没有三权分立相关设计。
- 在M-Compatibility中，可以给用户赋予ANY权限，表示用户能够在非系统模式下拥有对应的权限，包括CREATE ANY TABLE、SELECT ANY TABLE、TRUNCATE ANY TABLE、CREATE ANY INDEX等；在MySQL中，不支持ANY权限的赋予。
- MySQL中提供SHOW GRANTS查询用户权限；M-Compatibility中，可以通过gsql客户端元命令'\\l+'、'\\dn+'、'\\dp'查询权限信息，也可以通过查询pg_namespace、pg_class、pg_attribute等系统表的权限相关字段查询权限信息。
- MySQL中数据库、表、列被删除时，相关的授权信息在系统表中依然保留，如果重新创建同名对象用户依然拥有权限；M-Compatibility中当数据库、表、列被删除时，相关的授权信息会被删除，在重新创建同名对象后需要重新授权。
- MySQL在授予数据库层级的权限时，支持'_'和'%'对数据库名进行模糊匹配；M-Compatibility不支持对象名模糊匹配，'_'或'%'等特殊字符被识别为普通字符。
- MySQL中，GRANT语句中指定用户不存在时默认会创建该账户（此特性已在MySQL 8.0中移除）；M-Compatibility不支持给未创建用户赋权。
 
