PolarDB-X 1.0账号和权限系统的用法与MySQL一致,支持GRANT
、REVOKE
、SHOW GRANTS
、CREATE USER
、DROP USER
、SET PASSWORD
等语句。
账号
账号说明
用户名和主机名的组合username@'host'
可以确定一个账号。用户名一样但是主机名不一样则代表不同的账号。例如lily@30.9.73.96
和lily@30.9.73.100
是两个完全不同的账号,这两个账号的密码和权限都可能不一样。
在PolarDB-X 1.0控制台创建完数据库之后,系统会自动在该数据库下创建两个系统账号:管理员账号和只读账号。这两个账号是系统内置的,不能删除,不能修改其权限。
- 管理员账号的名字跟数据库名一致,比如数据库名是
easydb
,管理员账号的名字就叫easydb
。 - 只读账号的名字是数据库名加上
_RO
后缀,比如数据库名是easydb
,只读账号的名字就叫easydb_RO
。
例如有两个数据库dreamdb
、andordb
,根据上面的规则可知,dreamdb
下面包含管理员账号dreamdb
,只读账号dreamdb_RO
;andordb
下面包含管理员账号andordb
,只读账号andordb_RO
。
说明 PolarDB-X 1.0里通过CREATE USER创建出来的账号只存在于PolarDB-X 1.0,跟RDS没有任何关系,也不会同步到后端的RDS中去。
账号规则
- 管理员账号具有所有权限;
- 只有管理员账号具有创建账号和授权功能;其它账号只能由管理员账号创建,其权限只能由管理员账号授予;
- 管理员账号是跟数据库绑定的,没有其它数据库的权限,连接的时候只能连接自己对应的那个数据库,不能授予其它数据库的权限给某个账号。例如easydb这个管理员账号只能连接easydb数据库,只能授予easydb数据库权限或者easydb数据库中表的权限给某个账号;
- 只读账号只具有SELECT权限。
命名规则
- 区分大小写;
- 长度必须大于等于4个字符,小于等于20个字符;
- 必须以字母开头;
- 字符可以包括大写字母、小写字母、数字。
密码规则
- 长度必须大于等于6个字符,小于等于20个字符;
- 字符可以包括大写字母、小写字母、数字、特殊字符(@#$%^&+=)。
HOST匹配规则
- HOST必须是纯IP地址,可以包含
_
和%
通配符(_
代表一个字符,%
代表0个或多个字符)。含有通配符的HOST需要加上单引号,例如lily@'30.9.%.%',david@'%'; - 假设系统中有两个用户都符合当前登录的用户,则以最长前缀匹配(不包含通配符的最长IP段)的那个用户为准。例如系统有两个用户
david@'30.9.12_.xxx'
和david@'30.9.1%.234'
,在主机30.9.127.xxx
上面登录david,则使用的是david@'30.9.12_.xxx'
这个用户。 - 开启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授权。
给用户授予多个库权限
5.3.6及以上版本的PolarDB-X 1.0,支持给单个用户授予多个库权限。授权方式如下:
- 您可以在阿里云PolarDB-X 1.0控制台 “账号管理” 页面创建账户和授权,推荐您使用此方法。
- 也可以使用SQL语句CREATE USER和GRANT创建账户和授权。
说明 如果使用SQL语句,需注意:
- 只有管理员账户可以创建用户和授权。
- 管理员只能给用户授予自己库的权限。如果A库管理员创建了一个账户new_user@'%',要使new_user同时获得访问A库和B库的权限,需要A库管理员和B库管理员分别为其授权。
拥有多个库权限的用户使用
5.3.6及以上版本可以给用户授予多个库权限,如果new_user@’%’拥有了A和B库的SELECT和INSERT权限。使用时有以下限制:
- 如果用户当前登录为A库,要查询B库,需
use B; SELECT * FROM table_in_B;
,暂不支持跨库查询,如SELECT * FROM B.table_in_B;
。 - 如果用户当前登录为A库,要写入B库,需
use B; INSERT INTO table_in_B VALUES('value');
,暂不支持跨库插入,如INSERT INTO B.table_in_B VALUES('value');
。 - 其他SQL类型同理。
相关命令
创建账号(CREATE USER)- 语法
CREATE USER user_specification [, user_specification] ... user_specification: user [ auth_option ] auth_option: IDENTIFIED BY 'auth#string'
- 示例
- 创建一个名为lily,只能从30.9.73.96登录的账号,密码为123456。
CREATE USER lily@30.9.73.96 IDENTIFIED BY '123456';
- 创建一个名为david,可以从任意主机登录的账号,密码为空。
CREATE USER david@'%';
- 创建一个名为lily,只能从30.9.73.96登录的账号,密码为123456。
- 语法
DROP USER user [, user] ...
- 示例
移除账号lily@30.9.73.96:
DROP USER lily@30.9.73.96;
- 语法
SET PASSWORD FOR user = password_option password_option: { PASSWORD('auth_string') }
- 示例
修改账号lily@30.9.73.96的密码为123456。
SET PASSWORD FOR lily@30.9.73.96 = PASSWORD('123456')
给账号授权(GRANT)
- 语法
GRANT priv_type[, priv_type] ... ON priv_level TO user_specification [, user_specification] ... [WITH GRANT OPTION] priv_level: { | db_name.* | db_name.tbl_name | tbl_name } user_specification: user [ auth_option ] auth_option: { IDENTIFIED BY 'auth#string' }
说明 GRANT语句里面的账号如果不存在,同时又没有提供IDENTIFIED BY信息,则报账号不存在异常;如果提供了IDENTIFIED BY信息,则会创建该账号同时授权。 - 示例
- 在数据库easydb下面,创建一个用户名为david,可以在任意主机登录,具有easydb数据库所有权限的账号。
#方法1:先创建账号再授权 CREATE USER david@'%' IDENTIFIED BY 'your#password'; GRANT ALL PRIVILEGES ON easydb.* to david@'%'; #方法2:一条语句完成创建账号和授权两个操作 GRANT ALL PRIVILEGES ON easydb.* to david@'%' IDENTIFIED BY 'your#password';
- 在数据库easydb下面,创建一个用户名为hanson,可以在任意主机登录,具有easydb.employees表所有权限的账号。
GRANT ALL PRIVILEGES ON easydb.employees to hanson@'%' IDENTIFIED BY 'your#password';
- 在数据库easydb下面,创建一个用户名为hanson,只能在192.168.3.10登录,具有easydb.emp表的INSERT 和 SELECT权限的账号。
GRANT INSERT,SELECT ON easydb.emp to hanson@'192.168.3.10' IDENTIFIED BY 'your#password';
- 在数据库easydb下面创建一个只读账号actro,可以在任意主机登录。
GRANT SELECT ON easydb.* to actro@'%' IDENTIFIED BY 'your#password';
- 在数据库easydb下面,创建一个用户名为david,可以在任意主机登录,具有easydb数据库所有权限的账号。
- 语法
- 删除账号在某个权限级别下的权限项,具体权限级别由priv_level指定。
REVOKE priv_type [, priv_type] ... ON priv_level
- 删除账号在系统内(数据库级别和表级别的)的所有权限项。
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...
- 删除账号在某个权限级别下的权限项,具体权限级别由priv_level指定。
- 示例
- 删除hanson@’%’在easydb.emp表的CREATE、DROP、INDEX权限。
REVOKE CREATE,DROP,INDEX ON easydb.emp FROM hanson@'%';
- 删掉账号lily@30.9.73.96的所有权限。
REVOKE ALL PRIVILEGES,GRANT OPTION FROM lily@30.9.73.96;
说明 为了兼容MySQL,需同时写上GRANT OPTION。
- 删除hanson@’%’在easydb.emp表的CREATE、DROP、INDEX权限。
- 语法
SHOW GRANTS[ FOR user@host];
- 示例
SHOW GRANTS FOR user1@host;
说明 5.3.6及以上版本,SHOW GRANTS只显示当前用户权限,可在阿里云PolarDB-X 1.0控制台查看所有账号和权限信息。