本文首发于个人微信公众号《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 应该是设计的审核者,而不是建立者。

相关阅读:

扫码关注,一起进步

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

  1. oracle ko16mswin949,mysql字符集 - osc_wq7ij8li的个人空间 - OSCHINA - 中文开源技术交流社区...

    恰当的字符集,畅快的体验! 00.Oracle字符集 Subsets and Supersets   #子集与超集 Table A-11 Subset-Superset Pairs Subset(子集 ...

  2. linux文件权限 705,Linux 文件权限 - osc_86eb7mly的个人空间 - OSCHINA - 中文开源技术交流社区...

    文件权限 Linux 中任何一个文件都具有 「用户.用户组与其他用户」三种权限,一个用户可属于多个用户组.所有用户的相关信息都记录在 /etc/passwd 文件中,密码记录在 /etc/shaodw ...

  3. grandle oracle 驱动,oracle权限 - 千言sully的个人空间 - OSCHINA - 中文开源技术交流社区...

    一.用户与模式 用户:对数据库的访问,需要以适当用户身份通过验证,并具有相关权限来完成一系列动作 SYS用户,缺省始终创建,且未被锁定,拥有数据字典及其关联的所有对象 SYSTEM用户,缺省始终创建, ...

  4. mysql mtq_mysql基本操作 - osc_r3mtqivi的个人空间 - OSCHINA - 中文开源技术交流社区

    数据库基本操作 mysql -h ip地址 -P 端口 -u 用户名 -p (回车输入密码) //连接数据库 show databases; //查看所有的数据库 create database ; ...

  5. mysql v8 漏洞_mysql'密码安全 - osc_v8gts6gd的个人空间 - OSCHINA - 中文开源技术交流社区...

    MYSQL数据库的安全配置 MYSQL密码的修改与恢复 MYSQL数据库密码的修改 Mysql5.7以下默认root登录密码为空,安装完成之后首先需要修改root的登录密码. # mysqladm – ...

  6. mysql主从切换机制torch_Mysql主从复制 - osc_y0vjyklt的个人空间 - OSCHINA - 中文开源技术交流社区...

    Mysql主从复制原理 1:主库开始二进制日志(binlog): 2:从库执行change master 执行主库,此时主库会创建一个dump线程,用于向从库发送二进制日志: 3.从库执行 start ...

  7. mysql sycho_Java面试题 - osc_p1rj1z8j的个人空间 - OSCHINA - 中文开源技术交流社区

    1.Java有几种数据类型?分别是什么? Java有8种数据类型: 字符类型:char(16位) 布尔类型:boolean(true/false) 数值类型: 整数类型:byte(8位),short( ...

  8. mysql部署练习_MySQL主从练习 - osc_b9r67jnt的个人空间 - OSCHINA - 中文开源技术交流社区...

    1.按照1核CPU.4G内存.40G硬盘创建两台名为node-1和node-2的云主机. 2.在公有云中完成一个名为intnetX的内部网络为192.168.X.0的云主机网络区域配置,将该网络网关设 ...

  9. mysql 列转行union all_MySQL中的列转行 - osc_qheq8wav的个人空间 - OSCHINA - 中文开源技术交流社区...

    mysql中的列转行 在工作中遇到的一个MySQL列转行的统计: 场景 用户访问app时会跳出标签选择页面让用户选择喜欢的标签,在数据库中记录的是数组样式的字符串,数据样式大致如下: id user_ ...

最新文章

  1. 学习 PHP SOAP 扩展的一些笔记
  2. 计算机网络的组成相关,计算机网络的组成
  3. Java txt 下拉刷新_手写上拉加载,下拉刷新(小demo)
  4. sql group by having
  5. inotify-tools、sersync配置及压力测试
  6. 开源框架:CocoaPods 安装学习教程
  7. postgre 生成数据库html文档_还在手动整理数据库文档?试试这个(螺丝钉)数据库文档生成工具...
  8. 好用的工程项目管理软件推荐
  9. 肌营养不良最新研究进展(2021年)
  10. 基于you-get的视频批量下载
  11. jpg格式电脑怎么弄_(常见问题)如何把HEIC格式图片转换成JPG格式?
  12. 清北学堂学习笔记 第一期
  13. 如何使特定的数据高亮显示?
  14. python 月球上物体的体重,1.重量计算。月球上物体体重是在地球上的16.5%,假如你在地球上每年增长0.5KG,输出未来十年你在地球和月球上的体重状况...
  15. 关于Map入参,出参
  16. esxi6.7解锁并安装macOS
  17. 零基础入门3D游戏建模师知识必备
  18. 西瓜书读书笔记—绪论
  19. NCRE | 三级信息安全技术笔记
  20. Golden Gate入门指导:安装篇

热门文章

  1. html字符串转换jsx,javascript – 将React.element转换为JSX字符串
  2. 【电路补习笔记】10、电感式开关电源(BUCK 降压电路)
  3. opengl与Directx的区别
  4. 文件指针和文件描述符之间的相互转换 fd----fp 和 fp----fd
  5. vue项目登录及token验证 vue-ant
  6. React开发(246):react项目理解 this打印
  7. 重学java基础第十二课:计算机语言发展史
  8. React开发(171):处理删除与批量删除操作
  9. 前端学习(3134):react-hello-react之对象相关的性质
  10. [html] 写一个布局,当页面滚动一定高时,导航始终固定在顶部,反之恢复原位