第九章:第23节 MySQL基础篇——数据控制语言(DCL)

更新于:2019-01-14 14:46:43

MySQL在安装时会创建一个管理员账号“root”,“root”只是管理员默认的名字,它拥有着全部的权限。不仅只有“root”,MySQL还可以创建很多其他账号,可以给这些账号分配权限。


大家有没有发现,MySQL自带一个名字为“mysql”的数据库

1.png

这是MySQL自带的存储一些系统参数的数据库。里面有一个“user”表:这里面存储的是MySQL所有账号。


1.png

字段很多,第一个字段“Host”代表主机名,第二个字段“User”代表用户名,第三个很明显是密码,后面的字段全部表示的能够操作的权限。


为什么会显示三个“root”呢,我们看下表的结构:

1.png

它用的是联合主键。


第一个字段“Host”作用蛮大的,MySQL有密码保护,“Host”还可以起到IP限制的作用。


1.png

%.%.%.% 基本上任何IP的终端MySQL都允许被请求,“%”是通配符,可以换成具体的IP数字,比如“192.168.%.%”,只有“192.168”开头的IP的终端MySQL允许被请求。


iz25lhu7gndz 这是一个主机名,只有主机名是“iz25lhu7gndz”的终端MySQL允许被请求


localhost、127.0.0.1、::1 这三个都代表本机的作用,只有本机上的终端MySQL才允许被请求


MySQL在安装时root账户会默认这三个host。以前楠神曾遇到过问题,不小心删掉了一个host,PHP脚本与MySQL在同一服务器上,可PHP脚本就是访问不了MySQL,因为请求MySQL的host正是被删掉的,后来加上就OK了。


这节我们主要就是学习怎么对mysql的账户做增删改操作。


我们知道了有关账户的数据都存在user表里,可不可以用cmd或者Navicat对user表直接增删改?


答案是完全可以的。


修改user表后,在终端需要输入flush privileges。


这是因为我们修改的账户数据只是在硬盘里做了改动,而MySQL此时还在内存里运行,内存里的账户数据与硬盘里的账户数据此时还不同步。


flush privileges的作用:

flush privileges 命令的作用是将当前user和privilige表中的用户信息/权限设置从mysql库(MySQL数据库的内置库)中提取到内存里。MySQL用户数据和权限有修改后,希望在"不重启MySQL服务"的情况下直接生效,那么就需要执行这个命令。通常是在修改ROOT帐号的设置后,怕重启后无法再登录进来,那么直接flush之后就可以看权限设置是否生效,而不必冒太大风险。


忘记root密码拯救方法》》》



以上是直接操作user表,MySQL也提供了一些可操作账户数据的SQL语句——数据控制语言(DCL)


数据控制语言(DCL

数据控制,其实就是“分配权限”——就涉及到用户。

则主要就是2个问题:

用户管理:

权限分配:

有哪些权限。


mysql中的权限

mysql中,权限是系统内定的一些“名词”(单词),大约30个,每个权限表示“可以做什么工作”。 

则分配权限就是相当于让某个用户可以做哪些工作。

主要权限如下:

1.png

1.png


创建用户

语法形式:

create  user  '用户名'@'允许其登录的地址'  identified  by  '密码';

说明:

1,创建的用户需同时指定该用户可以在哪个地址进行登录。

其中“%”代表“任何地址”。

2,用户创建之后,自动在mysql的user表中添加了一条记录,但该用户还没有权限。


删除用户

drop  user  '用户名'@'允许其登录的地址';

或者直接进入mysql数据库,从user表直接删除:

delete from user where user = '用户名';

修改用户密码

修改自己密码: 

set  password = password('新密码');

修改他人密码(必须有修改权限):

set  password  for  '用户名'@'允许其登录的地址'  = password('新密码');

有些版本不支持上面的语句修改密码,可用这个:

ALTER USER '用户名'@'地址' IDENTIFIED BY '新密码';
#使用mysql_native_password加密规则
ALTER USER '用户名'@'地址' IDENTIFIED with mysql_native_password BY '新密码';

权限分配


增加权限:

grant 权限名1,权限名2....  on  数据库名.对象名 to  用户名@允许其登录的地址  identified by 密码

说明:

1权限名就是:select, update, delete,等等。其中ALL 表示“所有权限”,或all  privileges也一样

2对象名:就是一个数据库中“装”的东西,表是最常见的,也可以是视图,存储过程,存储函数等。

其中:**表示所有数据中的所有对象

某数据库名.*表示该数据库中的所有对象——这个商业上常用。

3identified by 密码用于给一个用户在此时修改密码,不写也可以,那就不修改密码。

4,但同时该语句也可以创建用户(如果不存在),但此时identified by 密码必须写。


例如:

grant all on *.* to 'nanshen'@'%.%.%.%'; //给nanshen用户在任何地址上所有的权限。



注: 视图、存储过程、存储函数也是MySQL的东西,但不是我们学习的重点,后面会简单介绍。


删除权限

revoke  权限名1,权限名2....  on  数据库名.对象名 from  用户名@允许其登录的地址 ;

表示从某个用户身上“取消”某些权限(也许还保留了其他权限)。



总结:


本节内容楠神感觉不需要刻意去学,所以我也都没有做演示。大部分项目数据库在创建之初都会分配好账户,以后用的时候可能都很少再去改这部分内容。也就是说用的少,不需要刻意记住。也没什么难度或者影响使用效率什么的,用到的时候再来边学边做都来得及。不影响MySQL的使用效率,但设置不好账户的IP限制和权限限制,还是会出安全问题的,需要注意。