说说MySQL权限

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

前言

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

受权方式

  在讲 MySQL 权限以前,咱们不得不先熟悉下MySQL中常见的两种受权方式。 sql

姑且称为:受权法改表法 吧。数据库

1. 受权法 后端

标准语法以下:服务器

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

其中:微信

  1. grant 为MySQL关键字。
  2. all 表示全部权限,也能够授予部分权限,如select,insert,update,create,drop等等。
  3. db_name 表示数据库名。其中:* 表示该数据库实例中的全部数据库。
  4. table_name 为db_name数据库中的表名。其中:* 表示db_name数据库中的全部表。
  5. user_name 表示数据库服务器中已经存在的用户名。
  6. host_name 表示容许链接的主机。(localhost / 127.0.0.1 表示本机,% 表示任何主机,也能够用域名表示。)

以设置root用户容许远程链接为例:数据结构

给 root 用户设置该实例上全部数据库的全部权限,且容许其经过任意主机链接该实例。则能够用下述语句表示:数据库设计

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

2. 改表法 函数

你必定很好奇,MySQL是如何判断用户是否有某数据库的权限?是否有某表的权限?
其实呀,在MySQL中是有特定数据结构来存储这部分信息的。咱们能够按照下述步骤来找到它,甚至能够来修改它,以达到修改权限的目的。优化

  1. 首先,咱们登陆到MySQL服务器。
  2. 进入MySQL服务器中自带的 mysql 数据库中。
  3. 找到 mysql 数据中的 user 表,修改对应用户的信息便可。

以设置root用户容许远程链接为例:

use mysql;

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

flush privileges;

执行以上语句后,咱们能够经过如下语检查是否生效:

show grants for 'root'@'%';

值得注意的是:

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

  1. 咱们在使用 grant 命令时,即受权法。其会自动通知MySQL服务器从新加载一次权限数据。以达到即时生效的效果。
  2. 但当咱们使用改表法时。是没有通知从新加载权限数据的。所以会致使其不会即时生效。直至服务重启后生效。服务重启,特别是生产环境,那几乎是灾难性的。好在MySQL为咱们提供了手动通知的命令。即:flush privilege命令。

例如:

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

链接权限

   经过上面的介绍,咱们如今应该已经知道了MySQL中常见的受权方式。如今就从实际角度来用用。咱们都知道在MySQL中默认是不容许root用户远程登陆的。咱们经过如下命令修改便可:

grant all on *.* to 'root'@'%';
  1. 若是想设置成经过指定的IP登陆,则能够将 %替换成特定的IP便可。
  2. 若是想设置成经过指定的IP段登陆,便可以将%替换成192.168.1.%便可。

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

表权限

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

  1. 设置用户 andyqian 在 customer 数据库中的 t_user 表的全部权限。
grant all on customer.t_user to 'andyqian'@'%';
  1. 设置用户 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
  1. 设置用户andyqiancustomer 数据库中 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命令来实现。

  1. 设置指定列的insert权限时:
grant insert(created_at,updated_at) on customer.t_user to 'andyqian'@'localhost';
  1. insert包括未设置权限的列时,则会有如下错误信息:
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基本一致。仅仅只是关键字不一样

  1. 撤销 用户 andyqiancustomer数据库中的t_usercreated_atupdated_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)
  1. 其中第一句: USAGE 表示没有特殊权限的意思。使用 show grants命令查看时,一般会一块儿显示在结果列表中。
  2. 第二句则表示用户 andyqian 在customer数据库中的t_user表中有select,insert 权限。

最后

  有不少童鞋会以为:数据库管理,SQL优化,索引创建等等,都是DBA的事情。开发人员不须要了解。我认为这种认知是错误的,数据库设计自己就是后端工程师工做职责的一部分。DBA 应该是设计的审核者,而不是创建者。


相关阅读:

写会MySQL索引

读懂MySQL执行计划

<center>公众号</center>

相关文章
相关标签/搜索