SQL语法支持
事务管理与锁语句
语句类型 | 事务语句 | 语句参数 | 状态 | 说明 |
---|---|---|---|---|
事务管理 | START TRANSACTION | 无参数 | 支持 | |
WITH CONSISTENT SNAPSHOT | 支持 | |||
READ WRITE | 支持 | |||
READ ONLY | 支持 | |||
BEGIN | 支持 | |||
COMMIT | 支持 | |||
COMMIT | [AND [NO] CHAIN] [[NO] RELEASE] | 支持 | ||
ROLLBACK | 支持 | |||
ROLLBACK | [AND [NO] CHAIN] [[NO] RELEASE] | 支持 | ||
SET autocommit | 0 | 1 | 支持 | |
SAVEPOINT | SAVEPOINT | 支持 | ||
ROLLBACK ... TO ... | 支持 | |||
RELEASE SAVEPOINT | 支持 | |||
LOCK | LOCK TABLES | READ [LOCAL] | 禁用 | |
[LOW_PRIORITY] WRITE | 禁用 | |||
UNLOCK TABLES | 禁用 | |||
LOCK INSTANCE FOR BACKUP | 禁用 | |||
UNLOCK INSTANCE | 禁用 | |||
事务隔离级别语句 | SET SESSION TRANSACTION | REPEATABLE READ | 支持 | XA模式可完整支持, 普通模式下会存在读到部分提交的情况 |
READ COMMITTED | 支持 | 普通模式下会存在读写不一致的问题; XA模式下支持,但跨库多次查询的情况下不保证读写强一致;即:对select 、insert select 这类SQL,如果出现一个SQL转成多个SQL执行的SQL语句,则SQL执行结果在该隔离级别下可能不正确。可参考数据强一致性(XA事务)章节章节描述 | ||
READ UNCOMMITTED | 不支持 | |||
SERIALIZABLE | 支持 | XA模式可完整支持, 普通模式下会存在读到部分提交的情况 | ||
SET GLOBAL TRANSACTION | REPEATABLE READ | 不支持 | 不支持SET GLOBAL的方式,只支持SET SESSION | |
READ COMMITTED | 不支持 | 不支持SET GLOBAL的方式,只支持SET SESSION | ||
READ UNCOMMITTED | 不支持 | |||
SERIALIZABLE | 不支持 | |||
SET SESSION TRANSACTION | READ ONLY | 支持 | ||
READ WRITE | 支持 | |||
SET GLOBAL TRANSACTION | READ ONLY | 不支持 | ||
READ WRITE | 不支持 | |||
A事务 | XA START | BEGIN ... | [JOIN | RESUME] |
XA END | [SUSPEND [FOR MIGRATE]] | 禁用 | ||
XA PREPARE | 禁用 | |||
XA COMMIT | [ONE PHASE] | 禁用 | ||
XA ROLLBACK | 禁用 | |||
XA RECOVER | 禁用 | |||
XA RECOVER | [CONVERT XID] | 禁用 | 5.7新增参数 |
其他语句
存储过程、自定义函数等语句
计算节点当前仅支持垂直库(即逻辑库仅关联一个数据节点)场景下使用存储过程,自定义函数等语句。
语句类型 | SQL语句 | 支持状态 | 说明 |
---|---|---|---|
存储过程 | BEGIN ... END ... | 限制支持 | 垂直库下可使用,下同 |
DECLARE | 限制支持 | ||
CASE | 限制支持 | ||
IF | 限制支持 | ||
ITRATE | 限制支持 | ||
LEAVE | 限制支持 | ||
LOOP | 限制支持 | ||
REPEAT | 限制支持 | ||
RETURN | 限制支持 | ||
WHILE | 限制支持 | ||
CURSOR | 限制支持 | ||
DECLARE ... CONDITION... | 限制支持 | ||
DECLARE ... HANDLER ... | 限制支持 | ||
GET DIAGNOSTICS | 限制支持 | ||
RESIGNAL | 限制支持 | ||
SIGNAL | 限制支持 | ||
插件和UDF语句 | CREATE [AGGREGATE] FUNCTION function_name RETURNS {STRING |INTEGER|REAL| DECIMAL} SONAME shared_library_name | 限制支持 | |
DROP FUNCTION | 限制支持 | ||
INSTALL PLUGIN | 禁用 | ||
UNINSTALL PLUGIN | 禁用 |
Prepare SQL Statement
语句类型 | SQL语句 | 支持状态 | 说明 |
---|---|---|---|
Prepare SQL Statement | PREPARE ... FROM ... | 支持 | |
EXECUTE ... | 支持 | ||
{DEALLOCATE | DROP} PREPARE | 支持 |
用户管理语句
HHDB Server实现了一套自己的用户名与权限管理的系统,可以优先在关系集群数据库可视化管理平台页面上操作即可。若使用数据库用户管理类的SQL语句,部分可以支持。
语句类型 | SQL语句 | 支持状态 | 说明 |
---|---|---|---|
用户管理语句 | ALTER USER | 禁用 | 通过平台操作可支持 |
CREATE USER | 支持 | 使用说明详见表格下方详细描述 | |
DROP USER | 支持 | 使用说明详见表格下方详细描述 | |
GRANT | 支持 | 使用说明详见表格下方详细描述 | |
RENAME USER | 禁用 | 通过平台操作可支持 | |
REVOKE | 支持 | 使用说明详见表格下方详细描述 | |
SET PASSWORD | 禁用 | 通过平台操作可支持 |
支持使用SQL语句创建/删除用户,并给用户赋权/解权。
创建用户
创建用户语法:
CREATE USER [IF NOT EXISTS] 'user_name'@'host_name' IDENTIFIED BY 'password_auth_string'[,'user_name'@'host_name' IDENTIFIED BY 'password_auth_string']...
服务端创建用户语法示例:
create user 'jingjingjing'@'%' identified by 'jing' with max_user_connections 3;
创建用户时执行用户必须具有super权限且不支持空密码创建,用户名最大长度限制64字符,密码暂未限制。
- 执行用户不具有super权限创建用户,提示如下:
- 空密码创建时,提示如下:
- 用户名超过限制,提示如下:
- 重复创建用户,提示如下:
删除用户
删除用户语法:
DROP USER [IF EXISTS] 'user_name'@'host_name' [,'user_name'@'host_name']...
服务端删除用户语法示例:
drop user 'jingjingjing'@'%';
删除用户时执行用户必须具有super权限。
- 执行用户不具有super权限删除用户,提示如下:
- 删除不存在的用户时,提示如下:
GRANT赋权
GRANT赋权语法:
GRANT
priv_type[, priv_type] ...
ON priv_level TO 'user_name'@'host_name'[,'user_name'@'host_name'] ...
[WITH MAX_USER_CONNECTIONS con_num]
提示
可授权的权限类型priv_type 包括:SELECT、 UPDATE、 DELETE、 INSERT 、CREATE 、DROP
、ALTER 、FILE 、 SUPER
可使用ALL [PRIVILEGES] 为用户赋予所有权限(包括SUPER权限)在内。
可授权的权限范围priv_level包括: * | . | db_name.* | db_name.tbl_name | tbl_name
- *:表示当前数据库中的所有表(必须use 逻辑库之后才能执行);
- *.*:表示所有数据库中的所有表/视图;
- db_name.*:表示某个数据库中的所有表/视图,db_name 指定数据库名;
- db_name.tbl_name:表示某个数据库中的某个表/视图,db_name 数据库名,tbl_name 表名;
- tbl_name:表示某个表/视图,tbl_name 指定表名(必须use 逻辑库之后才能执行)
服务端GRANT语法示例:
全局权限:
grant all on *.* to ' test_ct '@'localhost' identified by ' test_ct ' with max_user_connections 3;
库级权限:
grant all on test_ct.* to 'test_ct'@'localhost' identified by 'test_ct';
表级/视图级权限:
grant update on test_ct.test_aa to 'test_ct'@'localhost' identified by 'test_ct';
赋权注意事项:
- 执行赋权操作的用户本身必须有super权限。
- 可在赋权时同步创建用户但需带上密码。
- super和file必须赋全局管理权限,不支持库和表级别授权。
- all权限不能与其他权限同时使用只能单独赋权。
- 权限修改后只对新连接生效,不会改变已创建的连接权限。
- 执行赋权操作的用户不具有super权限,提示如下:
- 赋权时同步创建用户
- 赋权时同步创建用户不带密码,提示如下:
- super只能赋全局权限,不支持库和表级别授权,如下图:
- file权限只能赋全局权限,不支持库和表级别授权
- all权限只能单独授权,不能和其他权限项同时授权
6. 使用GRANT语句修改用户密码时,必须注意,若修改的用户对象是Keepalived/LVS配置文件中的连接用户,必须同步修改Keepalived/LVS配置文件中对应的连接密码并加载配置,否则可能导致计算节点高可用切换异常、或者LVS流量分发异常等问题。另外,也需要同步修改管理平台连接计算节点的用户密码配置,否则会立即导致管理平台无法连接计算节点,进而无法监控、无法操作等问题。
REVOKE删除权限
REVOKE删除权限语法:
REVOKE priv_type [, priv_type] ...ON priv_level FROM 'user_name'@'host_name' [, 'user_name'@'host_name'] ...
服务端REVOKE语法示例:
revoke select,update,delete,insert,create,drop,alter,file,super on *.* from jingjing05;
解权注意事项:
- 执行删除权限操作的用户本身必须有super权限。
- 可以移除部分权限和所有权限,可以移除对应库、表级别的权限。
- 权限项可重复移除,但移除不存在的类型会报语法错误。
- 权限修改后只对新连接生效,不会改变已创建的连接权限。
- 执行用户没有super权限时删除权限,提示如下:
- 支持移除部分权限
- 支持移除所有权限
- 支持移除库级别权限
- 支持移除表/视图级别权限
- 移除权限后再次使用该权限,报错提示如下
角色管理语句
计算节点支持使用SQL语句进行ROLE角色的添加、赋权、删除等权限操作。ROLE角色是一个权限的集合,可以被赋予给多个用户进行用户权限的统一管理。
语句类型 | SQL语句 | 支持状态 | 说明 |
---|---|---|---|
角色管理语句 | CREATE ROLE | 支持 | 创建角色 |
DROP ROLE | 支持 | 删除角色 | |
GRANT | 支持 | 赋予权限 | |
REVOKE | 支持 | 删除权限 |
创建角色
- 创建角色语法:
CREATE ROLE [IF NOT EXISTS] 'role_name'@'host_name' [,'role_name'@'host_name']...
- 语法示例:
CREATE ROLE 'web_writer', 'web_reader';
CREATE ROLE 'role01', 'role02';
CREATE ROLE 'role01'@'localhost';
- 语法说明:
- role_name表示创建的角色名。
- host_name表示主机名。在创建用户语法中,主机名的作用是指定用户访问逻辑库的IP地址;而在创建角色语法中,主机名并不表示IP地址,其意义类似于角色名,可以看作一种分类方式,其通过与角色名的多种排列组合以便对角色进行分类管理。 例如,当role_name均为admin,则允许存在多种admin角色,如admin@writer、admin@reader、admin@other等。当不指定主机名时,默认补充为%,则为admin@%。在ROLE定义中,%不具备通配符作用,只是表面上的符号意义,表示将未指定主机名的角色统一归类到%分类下。
- 注意事项:
- 创建角色时执行用户必须有SUPER权限。当不具有SUPER权限的用户执行创建角色操作时,提示如下:
- 重复创建角色,提示如下
删除角色
- 删除角色语法:
DROP ROLE [IF EXISTS] role [,role]...
- 语法示例:
DROP ROLE 'web_writer', 'web_reader';
- 注意事项:
- 删除角色,则会从授予该角色的每个用户中删除它;
- 删除角色时执行用户必须具有SUPER权限。当不具有SUPER权限的用户执行删除角色操作时,提示如下:
GRANT赋权
- 赋予角色权限
赋予角色权限语法:
GRANT priv_type [, priv_type ] ... ON priv_level TO 'role_name'@'host_name' [, 'role_name'@'host_name'] ...
语法示例:
库级别:
GRANT SELECT ON web_db.* TO 'role01';
--授权web_db库中所有表/视图的select权限给角色role01
表/视图级别:
GRANT SELECT, UPDATA, DELETE ON web_db.web_tbl TO 'role02';
--授权web_db库中web_tbl表/视图的select、update、delete权限给角色role02
全局级别:
GRANT ALL ON *.* TO 'role03';
--授权所有库中所有表/视图的全部权限给角色role3
语法说明:
- 可授权的权限类型priv_type包括:SELECT、UPDATE、DELETE、INSERT、CREATE、DROP、ALTER、FILE、SUPER
- 可授权的权限范围priv_level包括:|.|db_name.|db_name.tbl_name|tbl_name,具体说明如下:
Prive_level | 说明 | 使用前提 |
---|---|---|
* | 表示当前数据库中的所有表/视图 | 必须选定逻辑库之后才能执行 |
. | 表示所有数据库中的所有表/视图 | |
db_name.* | 表示某个数据库中的所有表/视图;db_name指定数据库名 | |
db_name.tbl_name | 表示某个数据库中的某张表;db_name指定数据库名、tbl_name指定表名/视图名 | |
tbl_name | 表示当前数据库中的某张表;tbl_name指定表名/视图名 | 必须选定逻辑库之后才能执行 |
- 可使用ALL [PRIVILEGES] 为用户赋予所有权限(包括SUPER权限)在内。
注意事项:
- 赋权时执行用户必须具有SUPER权限。当不具有SUPER权限的用户执行赋权操作时,提示如下:
- 重复授权无报错,可以直接执行成功:
- 赋予角色权限给用户
赋予角色权限给数据库用户语法:
GRANT <ROLE> TO <USER>
语法示例:
GRANT role01 TO user01;
GRANT role01 TO user01, user02;
GRANT role01, role02 TO user03;
GRANT role01, role02 TO user01, user02, user03;
语法说明:
允许同时赋予多个用户多个权限。
注意事项:
- 赋权时执行用户必须具有SUPER权限。当不具有SUPER权限的用户执行赋权操作时,提示如下:
- 角色不能授予匿名用户,提示如下:
- 用户和角色的权限有可互换性,角色权限可被赋予给用户,同理可将用户视为角色,并将该用户权限授予其他用户或角色:
REVOKE撤销权限
- 从角色中撤销权限
撤销角色权限语法:
REVOKE priv_type [, priv_type ] ...ON priv_level FROM 'role_name'@'host_name' [, 'role_name'@'host_name'] ...
语法示例:
撤销部分权限:
REVOKE SELECT, UPDATE ON test_database.* FROM role01;
-- 将赋予的test_database库中所有表/视图的SELECT、UPDATE权限从角色role01中移除
撤销所有权限:
REVOKE ALL ON test_database.* FRON role01;
-- 将赋予的test_database库中所有表/视图的全部权限从角色role01中移除
语法说明:
- 可撤销的权限类型priv_type和范围priv_level同GRANT一致。支持移除库、表、全局级别的权限,支持移除全部权限和部分权限。
- 可使用ALL [PRIVILEGES] 撤销所有权限(包括SUPER权限)在内。
注意事项:
- 撤销角色中的权限,则被授予该角色的每个用户中的对应权限都会被撤销;
- 撤销权限时执行用户必须具有SUPER权限。当不具有SUPER权限的用户执行撤权操作时,提示如下:
- 从用户中撤销角色
从数据库用户中撤销已赋予角色的语法:
REVOKE <ROLE> FROM <USER>
语法示例:
REVOKE role01 FROM user01;
REVOKE role01, role02 FROM user01;
REVOKE role01 FROM user01, user02;
REVOKE role01, role02 FROM user01, user02;
语法说明:
允许同时从多个用户中撤销多个角色
注意事项:
撤销角色时执行用户必须具有SUPER权限。当不具有SUPER权限的用户执行撤销角色操作时,提示如下:
查询角色权限
- 查询角色权限
查询角色权限语法:
SHOW GRANTS FOR <ROLE>;
语法示例:
SHOW GRANTS FOR role01;
-- 查看角色role01的权限mysql> show grants for role01;
+----------------------------------------------------------+
| Grants for role01@% |
+----------------------------------------------------------+
| GRANT SELECT,INSERT ON 'TEST_DATABASE'.* TO 'role01'@'%' |
| GRANT 'user01'@'%' TO 'role01'@'%' |
+----------------------------------------------------------+
1 row in set (0.01 sec)
语法说明:
- 查询结果直接通过之前操作的赋权语句显示已配置给角色的权限,若分次配置了相同库表的权限,则会整合显示;
- 查询结果显示顺序为,先显示单独配置的权限,再显示配置的ROLE权限(只显示赋予何种ROLE权限,不会具体到ROLE中有何权限)。
注意事项:
因为用户和角色的权限有可互换性,所以查询角色权限的语法与查询用户权限的语法相同。
- 查询用户权限关联角色权限
查询用户权限关联角色权限语法:
SHOW GRANTS FOR <USER> USING <ROLE>;
语法示例:
SHOW GRANTS FOR user01 USING role01;
-- 查看用户user01的权限,并细化到已赋权的角色role01内有何种权限
语法说明:
与查询角色权限语句不同的是,带USING的用户权限查询语句,除了显示单独配置给用户的权限和ROLE权限外,还会显示ROLE本身的权限集合;便于一次查询该角色下具体有何权限。
例如:赋予role01角色基于库表test_database.的select, insert权限;赋予user01用户基于库表test_database.的update权限;赋予role01角色基于库表zyftest.*的create权限;赋予user01用户role01的全部权限。完成上述权限赋予操作后,使用using role语句查看user01的权限,会尽数列举用户user01所拥有的全部权限(包含role01内的权限,且显示为赋予user01)
mysql> show grants for user01 using role01;
+----------------------------------------------------------+
| Grants for user01@% |
+----------------------------------------------------------+
| GRANT SELECT,INSERT ON `TEST_DATABASE`.* TO `user01`@`%` |
| GRANT UPDATE ON `TEST_DATABASE`.* TO `user01`@`%` |
| GRANT CREATE ON `ZYFTEST`.* TO `user01`@`%` |
| GRANT `role01`@`%` TO `user01`@`%` |
+----------------------------------------------------------+
3 rows in set (0.01 sec)
角色权限注意事项
- Role 和 User 无本质区别
- CREATE ROLE后, Role 状态为禁用,无法用于登录
- CREATE\DROP\GRANT\REVOKE 都需要且只需要 SUPER 权限
- Role 功能不需要关注存储节点版本
- 表级别权限的Role,赋权给User后,在管理平台User表权限列表不显示该权限(User有相关表权限)
- Role 创建时可以不指定密码,当解除该Role的禁用状态时,可以空密码登录,但无法在管理平台修改这个Role的密码
- Role\User之间可以相互赋权
- Role\User 无法赋权给自己