全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网
分布式关系型数据库 DRDS

DRDS 账号和权限系统

更新时间:2017-08-04 15:19:06

DRDS 账号和权限系统的用法跟 MySQL 一致,支持 GRANTREVOKESHOW GRANTSCREATE USERDROP USERSET PASSWORD 等语句,目前支持库级和表级权限的授予,全局级别和列级别权限暂时不支持。

MySQL 账号和权限系统的详细信息请参考 MySQL 官方文档

注意:DRDS 里通过 CREATE USER 创建出来的账号只存在于 DRDS,跟 RDS 没有任何关系,也不会同步到后端的 RDS 中去。

账号

用户名和主机名的组合 username@'host' 确定一个账号。用户名一样但是主机名不一样则代表不同的账号。例如 lily@30.9.73.96 和 lily@30.9.73.100 是两个完全不同的账号,这两个账号的密码和权限都可能不一样。

在 DRDS 控制台创建完数据库之后,系统会自动在该数据库下创建两个系统账号:管理员账号和只读账号。这两个账号是系统内置的,不能删除,不能修改其权限。

  • 管理员账号的名字跟数据库名一致,比如数据库名是 easydb,管理员账号的名字就叫 easydb
  • 只读账号的名字是数据库名加上 _RO 后缀,比如数据库名是 easydb,只读账号的名字就叫 easydb_RO

假设有两个数据库 dreamdbandordb,根据上面的规则可知,库 dreamdb 下面包含管理员账号 dreamdb,只读账号 dreamdb_RO;库 andordb 下面包含管理员账号 andordb,只读账号 andordb_RO

账号规则

  • 管理员账号具有所有权限;
  • 只有管理员账号具有创建账号和授权功能;其它账号只能由管理员账号创建,其权限只能由管理员账号授予;
  • 管理员账号是跟数据库绑定的,没有其它数据库的权限,连接的时候只能连接自己对应的那个数据库,不能授予其它数据库的权限给某个账号。例如 easydb 这个管理员账号只能连接 easydb 数据库,只能授予 easydb 数据库权限或者 easydb 数据库中表的权限给某个账号;
  • 只读账号只具有 SELECT 权限。

用户名规则

  • 大小写不敏感;
  • 长度必须大于等于4个字符,小于等于20个字符;
  • 必须以字母开头;
  • 字符可以包括大写字母、小写字母、数字。

密码规则

  • 长度必须大于等于6个字符,小于等于20个字符;
  • 字符可以包括大写字母、小写字母、数字、特殊字符(@#$%^&+=)。

HOST 匹配规则

  • HOST 必须是纯 IP 地址,可以包含 _% 通配符( _ 代表一个字符,% 代表0个或多个字符)。含有通配符的 HOST 需要加上单引号,例如 lily@’30.9.%.%’,david@’%’;
  • 假设系统中有两个用户都符合当前欲登录的用户,则以最长前缀匹配(不包含通配符的最长 IP 段)的那个用户为准。例如系统有两个用户 david@'30.9.12_.234'david@'30.9.1%.234',在主机 30.9.127.234 上面登录 david,则使用的是 david@'30.9.12_.234'这个用户。
  • 开启 VPC 时,主机的 IP 地址会发生变化。为避免账号和权限系统中的配置无效,请将 HOST 配置为 ‘%’ 来匹配任意 IP

权限

权限级别支持情况

  • 全局层级(暂不支持)
  • 数据库层级(支持)
  • 表层级(支持)
  • 列层级(暂不支持)
  • 子程序层级(暂不支持)

权限项

目前支持和表相关联的8个基本权限项:CREATE、DROP、ALTER、INDEX、INSERT、DELETE、UPDATE、SELECT。

  • TRUNCATE 操作需要有表上的 DROP 权限;
  • REPLACE 操作需要有表上的 INSERT 和 DELETE 权限;
  • CREATE INDEX 和 DROP INDEX 操作需要有表上的 INDEX 权限;
  • CREATE SEQUENCE 需要有数据库级的创建表(CREATE)权限;
  • DROP SEQUENCE 需要有数据库级的删除表(DROP)权限;
  • ALTER SEQUENCE 需要有数据库级的更改表(ALTER)权限;
  • INSERT ON DUPLICATE UPDATE 语句需要有表上的 INSERT 和 UPDATE 权限。

权限规则

  • 权限是绑定到账号(username@’host’),不是绑定到用户名(username);
  • 授权的时候会判断表是否存在,不存在则报错;
  • 数据库权限级别从高到低依次是:全局级别权限(暂不支持)、数据库级别权限、表级别权限、列级别权限。高级别权限的授予会覆盖低级别权限,移除高级别权限的同时也会移除低级别权限;
  • 不支持 USAGE 授权。

1. 创建账号(CREATE USER)语句

语法规则:

  1. CREATE USER user_specification [, user_specification] ...
  2. user_specification: user [ auth_option ]
  3. auth_option: IDENTIFIED BY 'auth_string'

例如:

创建一个名为 lily,只能从 30.9.73.96 登录的账号,密码为123456。

  1. CREATE USER lily@30.9.73.96 IDENTIFIED BY '123456';

创建一个名为 david,可以从任意主机登录的账号,密码为空。

  1. CREATE USER david@'%';

2. 删除账号(DROP USER)语句

语法规则:

  1. DROP USER user [, user] ...

例如:

移除账号 lily@30.9.73.96。

  1. DROP USER lily@30.9.73.96;

3. 修改账号密码(SET PASSWORD)语句

语法规则:

  1. SET PASSWORD FOR user = password_option
  2. password_option: {
  3. PASSWORD('auth_string')
  4. }

例如:

修改账号 lily@30.9.73.96 的密码为123456。

  1. SET PASSWORD FOR lily@30.9.73.96 = PASSWORD('123456')

4. 授权权限(GRANT)语句

语法规则:

  1. GRANT
  2. priv_type[, priv_type] ...
  3. ON priv_level
  4. TO user_specification [, user_specification] ...
  5. [WITH GRANT OPTION]
  6. priv_level: {
  7. | db_name.*
  8. | db_name.tbl_name
  9. | tbl_name
  10. }
  11. user_specification:
  12. user [ auth_option ]
  13. auth_option: {
  14. IDENTIFIED BY 'auth_string'
  15. }

注意:GRANT 语句里面的账号如果不存在,同时又没有提供 IDENTIFIED BY 信息,则报账号不存在异常;如果提供了 IDENTIFIED BY 信息,则会创建该账号同时授权。

例如:

在数据库 easydb 下面,创建一个用户名为 david,可以在任意主机登录,具有 easydb 数据库所有权限的账号。

方法1:先创建账号,再授权。

  1. CREATE USER david@'%' IDENTIFIED BY 'your_password';
  2. GRANT ALL PRIVILEGES ON easydb.* to david@'%';

方法2:一条语句完成创建账号和授权两个操作。

  1. GRANT ALL PRIVILEGES ON easydb.* to david@'%' IDENTIFIED BY 'your_password';

在数据库 easydb 下面,创建一个用户名为 hanson,可以在任意主机登录,具有 easydb.employees 表所有权限的账号。

  1. GRANT ALL PRIVILEGES ON easydb.employees to hanson@'%' IDENTIFIED BY 'your_password';

在数据库 easydb 下面,创建一个用户名为 hanson,只能在 192.168.3.10 登录,具有 easydb.emp 表的 INSERT 和 SELECT 权限的账号。

  1. GRANT INSERT,SELECT ON easydb.emp to hanson@'192.168.3.10' IDENTIFIED BY 'your_password';

在数据库 easydb 下面创建一个只读账号 actro,可以在任意主机登录。

  1. GRANT SELECT ON easydb.* to actro@'%' IDENTIFIED BY 'your_password';

5. 回收权限(REVOKE)语句

语法规则:

删除账号的权限

删除账号在某个权限级别下的权限项,具体权限级别由 priv_level 指定。

  1. REVOKE
  2. priv_type
  3. [, priv_type] ...
  4. ON priv_level
  5. FROM user [, user] ...

删除账号的所有权限

删除账号在系统内(数据库级别和表级别的)的所有权限项。

  1. REVOKE ALL PRIVILEGES, GRANT OPTION
  2. FROM user [, user] ...

例如:

删除 hanson@’%’ 在 easydb.emp 表的 CREATE、DROP、INDEX 权限。

  1. REVOKE CREATE,DROP,INDEX ON easydb.emp FROM hanson@'%';

删掉账号 lily@30.9.73.96 的所有权限。

  1. REVOKE ALL PRIVILEGES,GRANT OPTION FROM lily@30.9.73.96;

注意:为了兼容 MySQL,需同时写上 GRANT OPTION。

6. 查看授权(SHOW GRANTS)语句

语法规则:

  1. SHOW GRANTS[ FOR user@host];

查询所有的授权

  1. SHOW GRANTS

查询针对某个账号的授权情况

  1. SHOW GRANTS FOR user@host;
本文导读目录