MySQL GRANT:用户授权

授权就是为某个用户赋予某些权限。例如,可以为新建的用户赋予查询所有数据库和表的权限。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 语句中的权限类型(可参考《MySQL user表详解》一节阅读)。

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 REVOKE:删除用户权限》一节。

推荐文章
JSP Out.print()方法:输出数据到JSP页面

print方法用于输出数据到JSP页面。 语法1 print(booleanb) 该方法用于向JSP页面输出Boolean类型的布尔值。输出的内容将显示在JSP页面上。 参数说明: b:要输

apowersoft是什么软件?

Apowersoft录屏王是一款功能强大的系统屏幕录制软件,该软件除了基本的录制弄能以外,还包含屏幕截图、视频格式转换、音频输入参数调整、视频分享等多项使用功能,并且用户在录制的过程中,支持音频同步录

vhdl与verilog的区别是什么

VHDL全名Very-High-SpeedIntegratedCircuitHardwareDescripTIonLanguage,诞生于1982年。1987年底,VHDL被IEEE和美国国防部确认为

Struts2单个文件上传实例(超详细)

通过《Struts2文件上传简介》的学习,读者对如何使用Struts2框架进行文件上传已经有了一定的了解。本节将通过具体案例演示如何在Struts2项目中实现单个文件上传。此案例要求在文件上传成功后,

C++ if else详解

程序的运行可以看作是一个人在走路时迈出的步伐。要到达目的地,必须从头开始,然后迈开脚步,一步接一步,直到到达目的地。没学本节之前,我们所编写的程序就像有一条要跟着执行的“路径”,如图1所示。 图

Qt二进制文件操作(读和写)详解

除了文本文件之外,其他需要按照一定的格式定义读写的文件都称为二进制文件。 每种格式的二进制文件都有自己的格式定义,写入数据时按照一定的顺序写入,读出时也按照相应的顺序读出。 例如地球物理中常用的S

JSP PageContext.setAttribute()方法:设置属性

该方法用于在指定对象范围设置属性。 语法: setAttribute(Stringname,Objectvalue,intscope) 参数说明: name:要设置的属性名称。 value:

excel中count和counta的区别是什么?

COUNT与COUNTA都可以返回非空单元格的个数,经常用在Excel统计参数列表中指定项个数的情景中。而两者也是存在这差别的,如果不注意的话,这两个函数就容易搞混。下面本篇文章给大家count和co

Django模板系统

本节我们继续使用《Django视图函数》一节中的“Hello_my_django”函数来完成相关知识的讲解。 fromdjango.httpimportHttpResponse defHello

如何编写Python软件开发文档(7个技巧)

开发文档是经常被程序员忽略的工作,有时也会被管理者忽略。这往往是由于在项目生命周期结束的后期缺乏时间,以及人们认为自己不擅长写作,其中一些人确实写不好,但他们中的大多数能够完成一个良好的文档。 在任

ssm是什么?

ssm全称Spring+SpringMVC+MyBatis,是继SSH之后,目前比较主流的JavaEE企业级框架,适用于搭建各种大型的企业级应用系统。1、Spring简介Spring是一个开源框架,S

C++ generate_canonical均匀分布随机数函数用法详解

标准均匀分布是一个在范围[0,1)内的连续分布。generate_canonical()函数模板会提供一个浮点值范围在[0,1)内,且有给定的随机比特数的标准均匀分布。它有3个模板参数:浮点类型、尾数

Python os.stat()函数:获取文件基本信息

文件创建后,该文件本身就会包含一些基本信息,例如文件的大小、最后一次修改时间、最后一次访问时间等。通过os模块中的stat()函数可以获取到文件的这些基本信息。 stat()函数的基本语法格式如下:

冒泡排序算法(超级详细)

冒泡排序是一种简单的排序算法,它也是一种稳定排序算法。其实现原理是重复扫描待排序序列,并比较每一对相邻的元素,当该对元素顺序不正确时进行交换。一直重复这个过程,直到没有任何两个相邻元素可以交换,就表明

cdr调色板不见了怎么办?

cdr调色板不见了的解决方法:我们打开cdr,如图。打开我们的cdr后,我们点击菜单栏上的“窗口”,如图。选择调色板,我们常常用的就是RGB和CMYK的,我们就选择CMYK的打开,如图。在它的前方有个

状态模式(详解版)

在软件开发过程中,应用程序中的有些对象可能会根据不同的情况做出不同的行为,我们把这种对象称为有状态的对象,而把影响对象行为的一个或多个动态变化的属性称为状态。当有状态的对象与外部事件产生互动时,其内部

Linux日志文件(常见)及其功能

日志文件是重要的系统信息文件,其中记录了许多重要的系统事件,包括用户的登录信息、系统的启动信息、系统的安全信息、邮件相关信息、各种服务相关信息等。这些信息有些非常敏感,所以在Linux中这些日志文件

如何启动Django项目详解

我们使用django-admin命令成功创建项目后,我们要如何启动这个项目呢?本节的学习目标是能够通过本地回送地址127.0.0.1成功访问BookStore项目。 1.启动项目并实现访问 在CMD

开机出现“invalid partition table”怎么办?

开机提示“invalidpartitiontable”(无效磁盘分区,硬盘不能启动),应该是开机默认设置是机械硬盘开机了,而我们系统是安装在固态硬盘的,因此我们只需要将固态硬盘设置为第一启动项即可。设

云上压缩是什么软件?

云上压缩是一款全新的智能压缩软件,去除了各种广告弹窗和插件给用户一个极致简洁的压缩体验,极速的压缩解压缩核心技术,让文件处理起来更加的便捷。云上压缩特色:支持多种压缩模式极速、体积自由切换云上压缩亮点