MySQL GRANT用户授权的实现


Posted in MySQL onJune 18, 2021

授权就是为某个用户赋予某些权限。例如,可以为新建的用户赋予查询所有数据库和表的权限。MySQL 提供了 GRANT 语句来为用户设置权限。

在 MySQL 中,拥有 GRANT 权限的用户才可以执行 GRANT 语句,其语法格式如下:

GRANT priv_type [(column_list)] ON database.table
TO user [IDENTIFIED BY [PASSWORD] 'password']
[, user[IDENTIFIED BY [PASSWORD] 'password']] ...
[WITH with_option [with_option]...]

其中:

  • priv_type 参数表示权限类型;
  • columns_list 参数表示权限作用于哪些列上,省略该参数时,表示作用于整个表;
  • database.table 用于指定权限的级别;
  • user 参数表示用户账户,由用户名和主机名构成,格式是“'username'@'hostname'”;
  • IDENTIFIED BY 参数用来为用户设置密码;
  • password 参数是用户的新密码。

WITH 关键字后面带有一个或多个 with_option 参数。这个参数有 5 个选项,详细介绍如下:

  • GRANT OPTION:被授权的用户可以将这些权限赋予给别的用户;
  • MAX_QUERIES_PER_HOUR count:设置每个小时可以允许执行 count 次查询;
  • MAX_UPDATES_PER_HOUR count:设置每个小时可以允许执行 count 次更新;
  • MAX_CONNECTIONS_PER_HOUR count:设置每小时可以建立 count 个连接;
  • MAX_USER_CONNECTIONS count:设置单个用户可以同时具有的 count 个连接。

MySQL 中可以授予的权限有如下几组:

  • 列权限,和表中的一个具体列相关。例如,可以使用 UPDATE 语句更新表 students 中 name 列的值的权限。
  • 表权限,和一个具体表中的所有数据相关。例如,可以使用 SELECT 语句查询表 students 的所有数据的权限。
  • 数据库权限,和一个具体的数据库中的所有表相关。例如,可以在已有的数据库 mytest 中创建新表的权限。
  • 用户权限,和 MySQL 中所有的数据库相关。例如,可以删除已有的数据库或者创建一个新的数据库的权限。

对应地,在 GRANT 语句中可用于指定权限级别的值有以下几类格式:

  • *:表示当前数据库中的所有表。
  • *.*:表示所有数据库中的所有表。
  • db_name.*:表示某个数据库中的所有表,db_name 指定数据库名。
  • db_name.tbl_name:表示某个数据库中的某个表或视图,db_name 指定数据库名,tbl_name 指定表名或视图名。
  • db_name.routine_name:表示某个数据库中的某个存储过程或函数,routine_name 指定存储过程名或函数名。
  • TO 子句:如果权限被授予给一个不存在的用户,MySQL 会自动执行一条 CREATE USER 语句来创建这个用户,但同时必须为该用户设置密码。

权限类型说明

下面讲解 GRANT 语句中的权限类型。

1)授予数据库权限时,<权限类型>可以指定为以下值:

 

权限名称 对应user表中的字段 说明
SELECT Select_priv 表示授予用户可以使用 SELECT 语句访问特定数据库中所有表和视图的权限。
INSERT Insert_priv 表示授予用户可以使用 INSERT 语句向特定数据库中所有表添加数据行的权限。
DELETE Delete_priv 表示授予用户可以使用 DELETE 语句删除特定数据库中所有表的数据行的权限。
UPDATE Update_priv 表示授予用户可以使用 UPDATE 语句更新特定数据库中所有数据表的值的权限。
REFERENCES References_priv 表示授予用户可以创建指向特定的数据库中的表外键的权限。
CREATE Create_priv 表示授权用户可以使用 CREATE TABLE 语句在特定数据库中创建新表的权限。
ALTER Alter_priv  表示授予用户可以使用 ALTER TABLE 语句修改特定数据库中所有数据表的权限。
SHOW VIEW Show_view_priv 表示授予用户可以查看特定数据库中已有视图的视图定义的权限。
CREATE ROUTINE Create_routine_priv 表示授予用户可以为特定的数据库创建存储过程和存储函数的权限。
ALTER ROUTINE Alter_routine_priv 表示授予用户可以更新和删除数据库中已有的存储过程和存储函数的权限。
INDEX Index_priv 表示授予用户可以在特定数据库中的所有数据表上定义和删除索引的权限。
DROP Drop_priv 表示授予用户可以删除特定数据库中所有表和视图的权限。
CREATE TEMPORARY TABLES Create_tmp_table_priv 表示授予用户可以在特定数据库中创建临时表的权限。
CREATE VIEW Create_view_priv 表示授予用户可以在特定数据库中创建新的视图的权限。
EXECUTE ROUTINE Execute_priv 表示授予用户可以调用特定数据库的存储过程和存储函数的权限。
LOCK TABLES Lock_tables_priv 表示授予用户可以锁定特定数据库的已有数据表的权限。
ALL 或 ALL PRIVILEGES 或 SUPER Super_priv 表示以上所有权限/超级权限

2) 授予表权限时,<权限类型>可以指定为以下值:

 

权限名称 对应user表中的字段 说明
SELECT Select_priv 授予用户可以使用 SELECT 语句进行访问特定表的权限
INSERT Insert_priv 授予用户可以使用 INSERT 语句向一个特定表中添加数据行的权限
DELETE Delete_priv 授予用户可以使用 DELETE 语句从一个特定表中删除数据行的权限
DROP Drop_priv 授予用户可以删除数据表的权限
UPDATE Update_priv 授予用户可以使用 UPDATE 语句更新特定数据表的权限
ALTER Alter_priv  授予用户可以使用 ALTER TABLE 语句修改数据表的权限
REFERENCES References_priv 授予用户可以创建一个外键来参照特定数据表的权限
CREATE Create_priv 授予用户可以使用特定的名字创建一个数据表的权限
INDEX Index_priv 授予用户可以在表上定义索引的权限
ALL 或 ALL PRIVILEGES 或 SUPER Super_priv 所有的权限名

3) 授予列权限时,<权限类型>的值只能指定为 SELECT、INSERT 和 UPDATE,同时权限的后面需要加上列名列表 column-list。

4) 最有效率的权限是用户权限。
授予用户权限时,<权限类型>除了可以指定为授予数据库权限时的所有值之外,还可以是下面这些值:

  • CREATE USER:表示授予用户可以创建和删除新用户的权限。
  • SHOW DATABASES:表示授予用户可以使用 SHOW DATABASES 语句查看所有已有的数据库的定义的权限。

例 1

使用 GRANT 语句创建一个新的用户 testUser,密码为 testPwd。用户 testUser 对所有的数据有查询、插入权限,并授予 GRANT 权限。SQL 语句和执行过程如下。

mysql> GRANT SELECT,INSERT ON *.*
    -> TO 'testUser'@'localhost'
    -> IDENTIFIED BY 'testPwd'
    -> WITH GRANT OPTION;
Query OK, 0 rows affected, 1 warning (0.05 sec)

使用 SHOW GRANTS 语句查询用户 testUser 的权限,如下所示。

mysql> SHOW GRANTS FOR 'testUser'@'localhost';
+-------------------------------------------------------------------------+
| Grants for testUser@localhost                                           |
+-------------------------------------------------------------------------+
| GRANT SELECT, INSERT ON *.* TO 'testUser'@'localhost' WITH GRANT OPTION |
+-------------------------------------------------------------------------+
1 row in set (0.00 sec)

结果显示,testUser 对所有数据库的所有表有查询、插入权限,并可以将这些权限赋予给别的用户。

拓展

数据库管理员给普通用户授权时一定要特别小心,如果授权不当,可能会给数据库带来致命的破坏。一旦发现给用户的权限太多,应该尽快使用 REVOKE 语句将权限收回。此处特别注意,最好不要授予普通用户 SUPER 权限,GRANT 权限。

到此这篇关于MySQL GRANT用户授权的实现的文章就介绍到这了,更多相关MySQL GRANT用户授权 内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
mysql部分操作
Apr 05 MySQL
仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案
May 06 MySQL
MySQL中你可能忽略的COLLATION实例详解
May 12 MySQL
MySQL 使用事件(Events)完成计划任务
May 24 MySQL
MySQL中出现乱码问题的终极解决宝典
May 26 MySQL
浅谈MySQL函数
Oct 05 MySQL
mysql5.6主从搭建以及不同步问题详解
Dec 04 MySQL
分享MySQL常用 内核 Debug 几种常见方法
Mar 17 MySQL
Mysql分析设计表主键为何不用uuid
Mar 31 MySQL
Mysql多层子查询示例代码(收藏夹案例)
Mar 31 MySQL
MySQL详细讲解变量variables的用法
Jun 21 MySQL
MySQL 原理与优化之原数据锁的应用
Aug 14 MySQL
浅谈MySQL user权限表
Jun 18 #MySQL
解决mysql模糊查询索引失效问题的几种方法
Jun 18 #MySQL
MySQL 亿级数据导入导出及迁移笔记
如何使用分区处理MySQL的亿级数据优化
Jun 18 #MySQL
详解MySQL中的pid与socket
Jun 15 #MySQL
MySQL 如何设计统计数据表
Jun 15 #MySQL
浅谈MySQL 亿级数据分页的优化
You might like
php session安全问题分析
2011/06/24 PHP
PHP中获取变量的变量名的一段代码的bug分析
2011/07/07 PHP
PHP简单判断字符串是否包含另一个字符串的方法
2016/03/25 PHP
基于PHP实现栈数据结构和括号匹配算法示例
2017/08/10 PHP
location.href 在IE6中不跳转的解决方法与推荐使用代码
2010/07/08 Javascript
JS小功能(offsetLeft实现图片滚动效果)实例代码
2013/11/28 Javascript
JS判断两个时间大小的示例代码
2014/01/28 Javascript
jquery实现网页查找功能示例分享
2014/02/12 Javascript
nodejs爬虫抓取数据乱码问题总结
2015/07/03 NodeJs
使用CoffeeScrip优美方式编写javascript代码
2015/10/28 Javascript
跟我学习javascript的prototype,getPrototypeOf和__proto__
2015/11/17 Javascript
JavaScript 函数的执行过程
2016/05/09 Javascript
AngularJS中的包含详细介绍及实现示例
2016/07/28 Javascript
BootstrapTable refresh 方法使用实例简单介绍
2017/02/20 Javascript
JavaScript之浏览器对象_动力节点Java学院整理
2017/07/03 Javascript
微信小程序之多列表的显示和隐藏功能【附源码】
2018/08/06 Javascript
JavaScript对象属性操作实例解析
2020/02/04 Javascript
WebStorm中如何将自己的代码上传到github示例详解
2020/10/28 Javascript
python中文乱码的解决方法
2013/11/04 Python
Python批量重命名同一文件夹下文件的方法
2015/05/25 Python
浅谈Python中range和xrange的区别
2017/12/20 Python
使用 Python 实现简单的 switch/case 语句的方法
2018/09/17 Python
浅谈python编译pyc工程--导包问题解决
2019/03/20 Python
详解pandas.DataFrame中删除包涵特定字符串所在的行
2019/04/04 Python
Python学习笔记之字符串和字符串方法实例详解
2019/08/22 Python
在python中做正态性检验示例
2019/12/09 Python
使用Pandas将inf, nan转化成特定的值
2019/12/19 Python
婴儿地球:Baby Earth
2018/12/25 全球购物
.net笔试题
2014/03/03 面试题
幼儿园教师考核制度
2014/02/01 职场文书
行政助理的岗位职责
2014/02/18 职场文书
党员活动日总结
2014/05/05 职场文书
工程学毕业生自荐信
2014/06/14 职场文书
观看《筑梦中国》纪录片心得体会
2016/01/18 职场文书
中国式结婚:司仪主持词(范文)
2019/07/25 职场文书
Nginx+SpringBoot实现负载均衡的示例
2021/03/31 Servers