说说mysql_说说MySQL权限 - andyqian的个人空间 - OSCHINA - 中文开源技术交流社区

本文首发于个人微信公众号《andyqian》,期待你的关注~

前言

今天继续MySQL系列文章,讲讲MySQL权限相关的内容。我们都知道,在写系统的时候,都会有权限相关的服务,以达到权限控制的目的。以最简单的权限菜单为例: 管理员拥有最大权限,可以查看系统下所有菜单。操作员只拥有部分菜单权限。同样的,在MySQL数据库中也有相应的权限管理。例如:数据库连接权限,新增,修改,查询权限等等。下面我们就一一揭晓MySQL权限的真实面貌。

授权方式

在讲 MySQL 权限之前,我们不得不先熟悉下MySQL中常见的两种授权方式。

姑且称为:授权法 和 改表法 吧。

1. 授权法

标准语法如下:

grant all on db_name.table_name to 'user_name'@'host_name';

其中:

grant 为MySQL关键字。

all 表示所有权限,也可以授予部分权限,如select,insert,update,create,drop等等。

db_name 表示数据库名。其中:* 表示该数据库实例中的所有数据库。

table_name 为db_name数据库中的表名。其中:* 表示db_name数据库中的所有表。

user_name 表示数据库服务器中已经存在的用户名。

host_name 表示允许连接的主机。(localhost / 127.0.0.1 表示本机,% 表示任何主机,也可以用域名表示。)

以设置root用户允许远程连接为例:

给 root 用户设置该实例上所有数据库的所有权限,且允许其通过任意主机连接该实例。则可以用下述语句表示:

grant all on *.* to 'root'@'%';

2. 改表法

你一定很好奇,MySQL是如何判断用户是否有某数据库的权限?是否有某表的权限?

其实呀,在MySQL中是有特定数据结构来存储这部分信息的。我们可以按照下述步骤来找到它,甚至可以来修改它,以达到修改权限的目的。

首先,我们登录到MySQL服务器。

进入MySQL服务器中自带的 mysql 数据库中。

找到 mysql 数据中的 user 表,修改对应用户的信息即可。

以设置root用户允许远程连接为例:

use mysql;

update user set host="%" where user="root";

flush privileges;

执行以上语句后,我们可以通过以下语检查是否生效:

show grants for 'root'@'%';

值得注意的是:

为了权限验证时的高效性。MySQL在服务启动时,就会将权限数据加载在内存中。因此,授权法 与 改表法 会有以下细微差异:

我们在使用 grant 命令时,即授权法。其会自动通知MySQL服务器重新加载一次权限数据。以达到即时生效的效果。

但当我们使用改表法时。是没有通知重新加载权限数据的。因此会导致其不会即时生效。直至服务重启后生效。服务重启,特别是生产环境,那几乎是灾难性的。好在MySQL为我们提供了手动通知的命令。即:flush privilege命令。

例如:

mysql> flush privileges;

Query OK, 0 rows affected (0.01 sec)

连接权限

通过上面的介绍,我们现在应该已经知道了MySQL中常见的授权方式。现在就从实际角度来用用。我们都知道在MySQL中默认是不允许root用户远程登录的。我们通过以下命令修改即可:

grant all on *.* to 'root'@'%';

如果想设置成通过指定的IP登录,则可以将 %替换成特定的IP即可。

如果想设置成通过指定的IP段登录,即可以将%替换成192.168.1.%即可。

(其中: 将192.168.1修改成你想要IP段即可!)

表权限

知道了连接权限,我们再来说说表权限。以几种常见的场景为例:

设置用户 andyqian 在 customer 数据库中的 t_user 表的所有权限。 grant all on customer.t_user to 'andyqian'@'%';

设置用户 andyqian 在 customer 数据库中 t_user 表的只读权限。 grant select on customer.t_user to 'andyqian'@'%';

当仅仅只设置只读权限时,执行update命令会有如下错误信息: mysql> update t_user set name="sansan",updated_at=now() where oid=1;

ERROR 1142 (42000): UPDATE command denied to user 'andyqian'@'localhost' for table 't_user

设置用户andyqian在 customer 数据库中 t_user 表的可读可写权限。 grant select,insert,update on customer.t_user to 'andyqian'@'%';

当仅仅只设置可读,可写,可修改权限时,执行drop命令会有如下错误信息: mysql> drop table t_user;

ERROR 1142 (42000): DROP command denied to user 'andyqian'@'%' for table 't_user

列权限

在某些场景下,我们需要将权限精确到列上。我们也可以使用 grant命令来实现。

设置指定列的insert权限时: grant insert(created_at,updated_at) on customer.t_user to 'andyqian'@'localhost';

```

mysql> insert into t_user(name,created_at,updated_at)values('name',now(),now());

ERROR 1143 (42000): INSERT command denied to user 'andyqian'@'localhost' for column 'name' in table 't_user'

撤销权限

有添加权限,肯定也少不了撤销权限。其语法与grant基本一致。仅仅只是关键字不同

撤销 用户 andyqian 对 customer数据库中的t_user表 created_at和updated_at字段的新增权限。 revoke insert(created_at,updated_at) on customer.t_user from 'andyqian'@'localhost';

查看用户权限

上面说到,如果用户执行没有权限的命令时。则会显示错误信息。为了避免这种情况发生。我们可以先通过以下命令来查看当前用户拥有的权限。

命令: show grants for 'user_name'@'localhost'

其可以使用current_user()函数来表示当前登录用户。

例如:

mysql> show grants for current_user();

+-----------------------------------------------------------------------+

| Grants for andyqian@localhost                                         |

+-----------------------------------------------------------------------+

| GRANT USAGE ON *.* TO 'andyqian'@'localhost'                          |

| GRANT SELECT, INSERT ON `customer`.`t_user` TO 'andyqian'@'localhost' |

+-----------------------------------------------------------------------+

2 rows in set (0.00 sec)

其中第一句: USAGE 表示没有特殊权限的意思。使用 show grants命令查看时,通常会一起显示在结果列表中。

第二句则表示用户 andyqian 在customer数据库中的t_user表中有select,insert 权限。

最后

有很多童鞋会觉得:数据库管理,SQL优化,索引建立等等,都是DBA的事情。开发人员不需要了解。我认为这种认知是错误的,数据库设计本身就是后端工程师工作职责的一部分。DBA 应该是设计的审核者,而不是建立者。

相关阅读:

f2eebae59bcb36dc3945edaf1358e22b.png

扫码关注,一起进步

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409109.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[机器学习笔记] Note1--机器学习简介

阅读本文大约需要 2 分钟 本文结构: 什么是机器学习监督学习(Supervised Learning)非监督学习(Unsupervised Learning)课程小结 这是学习 Andrew Ng 在 Coursea 上的机器学习课程所做的笔记。 什么是机器学习 对于机器学习,并没有一个一致认同的定义…

mysql执行过程五步_简单五步教你搭建MySQL主从复制

环境主机:172.17.0.2从机:172.17.0.3环境:CentOS7MySQL:5.6.38目标:实现主机172.17.0.2到从机172.17.0.3基于Binlog的主从复制目前MySQL提供两种方式主从复制:基于Binlog(我们此篇就是基于Binlog的主从复制…

[机器学习笔记] Note2--单变量线性回归

继续是机器学习课程的笔记,这节介绍的是单变量线性回归算法,线性回归算法也是一个比较基础的算法。 模型表达 首先是以房屋交易问题为例,假设我们回归问题的训练集如下表所示: Size in feet2feet2(x)Price($) in 1000’s (y)21…

linux打印mysql堆栈_第25问:MySQL 崩溃了,打印了一些堆栈信息,怎么读?

问题在 09 问中,我们开启了 coredump 功能,在 MySQL 崩溃时获得了有用的 coredump 信息。那如果没开启 coredump,仅有 error log 中的堆栈信息,我们如何分析有效的信息?实验我们沿用 09 问中的 MySQL 崩溃的场景&#…

[机器学习笔记] Note3--多变量线性回归

继续是机器学习课程的笔记,这节课介绍的是多变量的线性回归。 多变量线性回归 多维特征 上节课介绍的是单变量的线性回归,这节课则是进一步介绍多变量的线性回归方法。 现在假设在房屋问题中增加更多的特征,例如房间数,楼层等…

mysql主键long_MySQL主键设计

[TOC]在项目过程中遇到一个看似极为基础的问题,但是在深入思考后还是引出了不少问题,觉得有必要把这一学习过程进行记录。MySQL主键设计原则MySQL主键应当是对用户没有意义的。MySQL主键应该是单列的,以便提高连接和筛选操作的效率永远也不要…

[机器学习笔记] Note4--逻辑回归

继续是机器学习课程的笔记,这节课会介绍逻辑回归。 分类问题 这节课会介绍的是分类问题,其结果是离散值。分类问题的例子有判断电子邮件是否是垃圾邮件;判断肿瘤是良性还是恶性;判断一次金融交易是否是欺诈等等。 首先从二元的…

java容器集合类的区别用法_Java容器笔记(二):不同集合实现类的特点与区别...

package java.util包中的Collection相关接口和类如下图:Collection.png仅讨论Java.util包中的常见集合类,不涉及java.util的子包concurrent中的并发集合类。可以这样简单的来对待容器中集合:Collection_common.png1、 List、Set、Queue三个接…

[机器学习笔记]Note5--归一化

继续是机器学习课程的笔记,这节课会介绍归一化的内容。 过拟合问题 这节课会介绍一个在机器学习过程中经常会遇到的问题–过拟合。通常,当我们有非常多的特征,我们可以学习得到的假设可能非常好地适应训练集,即代价函数可能几乎…

combobox的联动练习

老师的项目中,网站右上有四个联动的combobox,今天第一次尝试解决。外观如图: 首先第一次登陆系统时,需要分别载入4个框中的数据。通过easyui-combobox的url 属性请求php返回json数据即可,json中的value是名称&#xff…

[机器学习笔记]Note6--神经网络:表达

继续是机器学习课程的笔记,这节课会介绍神经网络的内容。 非线性假设 在之前的课程中,我们看到使用非线性的多项式能够帮助我们建立更好的分类模型。假设我们有非常多的特征,例如100个变量,我们希望用这100个特征来构建一个非线…

[机器学习笔记]Note7--神经网络:学习

继续是机器学习课程的笔记,这节课会继续介绍神经网络的内容,上一节主要是基本的介绍,以及模型表示,而本节会介绍代价函数,反向传播算法等。 神经网络代价函数 首先是有如下一个神经网络,这里将首先介绍一些…