【MySQL】视图 + 用户管理
视图
- 前言
- 正式开始
- 视图
- 用户管理
- user表
- 创建新用户
- 修改用户密码
- 权限管理
- 给用户赋权
- 剥夺权限
前言
本篇所讲的视图和我上一篇事务中所讲的读视图不是一个东西,二者没有任何关系,如果看过我前一篇博客的同学不要搞混了。
其实视图和用户管理本来是想着分开来说的,不过两个的内容都比较少,就直接放一块讲了。
正式开始
视图
视图其实很简单,理解是一个虚拟表,其内容由查询定义。
语法:
create view 视图名 as select语句;
来个例子,用我前面博客中创建的两张表:
当前这个库中有三张表,除了上面的dept和emp,还有一个salgrade,不过这个表后面用不上:
我前面讲过,建表对应到系统中就是在建文件:
这里存储引擎是InnoDB的,所以每个表对应两个文件,一个.frm为存储表结构的文件,一个.ibd为存储索引和数据的文件。
这里用emp和dept这两张表进行内连接,连接条件为两表中的deptno相等,取出其中的enmae列和dname列:
但是如果我想要高频的查找这两列数据的话,每次都要高很长的sql,比较麻烦,那么就可以用视图来创建一个虚拟的表结构:
可以看到创建一个视图就相当于是创建了一张表,我们可以对myview这个视图进行查看,用起来就像表一样:
那么也会在对应的路径下产生相应的文件:
不过这里创建视图后,只产生了一个.frm文件,也就是只有一个存储表结构的文件。
那存储表中数据的文件在哪里呢?
其实就是emp和dept的.ibd文件,视图和基表中的数据是同步的。
像emp表和dept表都是基表。
当我对视图中的数据进行修改:
可以看到基表中的数据也被改了,看一下emp基表:
可以看到被修改了。
那么我再改一下dept表中的数据:
可以看到也修改了。
同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。
如果想要删除视图,用drop:
视图规则和限制
- 与表一样,必须唯一命名(不能出现同名视图或表名)
- 创建视图数目无限制,但要考虑复杂查询创建为视图之后的性能影响
- 视图不能添加索引,也不能有关联的触发器或者默认值
- 视图可以提高安全性,必须具有足够的访问权限
- 尽量不要在视图中用order by
- 视图可以和表一起使用
用户管理
user表
在数据库刚装好后会有几个库是自带的,比如说mysql、sys等:
这几个库中的表不要随便删,小心出问题,我记得我不久前把db_1整个库给删了,研究了半天,最后重新下了mysql才搞好的。
这些库中有很多表结构。
MySQL在登录的时候也要记录下来哪些用户允许使用MySQL,哪些用户不允许使用MySQL,而这些信息也是要在MySQL中的特定表结构中保存下来的,而这个表就是上图中mysql库中的user表:
看一下这个表中都有什么内容(里面的字段有点多,横着打印看不全,先截出来一部分):
其实很多字段都没必要看,看下面的这三个就行:
- host: 表示这个用户可以从哪个主机登陆,如果是localhost,表示只能从本机登陆
- user: 用户名
- authentication_string: 用户密码通过password函数加密后形成的密文(这一点在我前面的博客中也讲过,就是通过hash来给你的密码进行加密,不明文存放密码,登录的时候只需要再次经过相同的哈希算法来比较库中存放的结果)
- 上面的一堆*_priv: 用户拥有的权限
图中root用户就是默认的超级用户,这个就不说了吧。
关于session和sys用户:
session:MySQL5.7新增用户,用于用户身份验证。
sys:MySQL5.7新增用户,用于系统模式对象的定义,防止DBA(数据库管理员)重命名或删除root用户时发生错误。默认情况下,用户mysql.session和mysql.sys已被锁定,使得数据库操作人员无法使用这两个用户通过客户端连接MySQL服务器.因此,建议不要随意解锁和使用mysql.session和mysql.sys用户.
————————————————
版权声明:本文为CSDN博主「是乔乔啊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_24889005/article/details/107590471
上面我是设置好了只有一个root用户,如果我现在想用其他名字来登录是不行的:
不管有没有密码都是认证失败的。
如果我们只能使用root用户,这样存在安全隐患。这时,就需要使用MySQL的用户管理,像下面图中这样,给某个用户特定的权限,只能访问部分库:
这就是用户管理。
下面来说说如何添加新用户。
创建新用户
语法:
create user '用户名'@'登陆主机/ip' identified by '密码';
其中@后面跟的是你想要新创建出来的用户在哪台主机上可以登陆,必须得指定,可以理解为’用户名’@'登陆主机/ip’是搭配在一块的。
演示:
这里创建一个名字为张三的用户,登录主机的IP是localhost,也就是只能我本机登录。
可以看到创建一个用户就是在对应user表中添加一条记录,那么其实我们也可以直接往这个表中暴力插入一条用户记录,是可以登录的,不过表中的列太多了,这样搞着很麻烦,不如直接用create user,同样的效果,就是插入一条记录。
这里只是为了让你明白创建用户、删除用户、修改用户信息等操作就是在user表中做增删改。
新用户创建好了之后必须得用flush privileges刷新一下:
登录:
成功。
我这里Windows下也安装有mysql,测试一下远端登录:
-P后面跟的是端口号,我这里就不把我的端口号给出来了(不要轻易的把你mysql服务器的端口号暴露到公网上)。
可以看到这里登录失败了,上面说我这里的IP不允许登录我云服务器上的mysql。意思就是我不能进行远端登录。
那我来创建一个能远端登录的用户:
%表示所有主机都能登录,这样搞是因为你远端登录的时候可能换一个网IP就会改变,一变就要再设置一下指定IP,但是这样比较麻烦。用%更方便一点,但是不推荐这样做。
可以通过netstat来查看我当前Windows下的连接:
所以说mysql支持远端登录,但是登录时要有远端账户才可以。
修改用户密码
再说一下password函数,这其实就是一个hash函数,可以将一个字符串转换成一段定长字符串:
可以看到就算是相差一个字符,结果都会有很大变化。
库中存放的都是这些加密后的字符串,这样做就是为了防止数据库泄漏之后像密码这样的重要信息不会丢失。
设置密码的语法有两种,一种是自己给自己设置密码:
set password=password('新的密码');
还有一种是root用户修改指定用户的密码:
set password for '用户名'@'IP'=password('新密码');
root改刚刚的张三:
不过Linux下不会回显密码,这里眼看不出来改没改密码,反正使用qwer登录的:
张三自己改自己:
也可以直接让user对表中的authentication_string做修改:
也是可以登录的,这里改的是tmp,我直接远端登:
这里Windows下能看到有登录的密码有四个字符。
权限管理
MySQL数据库提供的权限列表:
我在win下用tmp用户登录,查看库的时候只有部分库能够看到:
因为tmp没有其他库的权限,所以是看不到的。
而root就可以看到所有的库:
因为root的权限很高。
普通用户想要看到库的话得要有对应的权限。
给用户赋权
语法:
grant 权限列表 on 库.对象名 to '用户名'@'登陆位置' [identified by '密码'];
其中权限列表可以直接给all,也可以指定某些权限(一般都是CURD操作的权限)。
on库.对象名表示对哪个库下的哪张表进行赋权,如果想要对所有库下的所有表进行赋权就可以用*.*,如果想要对某个库下的所有表进行赋权可以用库名.*。
to表示给哪个用户赋权。
后面的identified by '密码’可以不用写。如果写了且用户存在,赋予权限的同时会修改密码,如果该用户不存在,就是创建用户。
我来用root账户创建一个库:
用tmp用户是看不到的:
还是和刚刚一样。
强行use一下:
而且当前这个tmp用户还没法创建库:
用root给tmp赋权刚刚的rootDB:
这里意思就是给rootDB库中的所有表赋权。
现在用tmp就能看到rootDB库了:
选中也没问题:
不过里面还没有创建表。
因为有所有的权限,tmp可以直接在里面创建表:
root此时也是能看到这张表的:
用root来插入两条记录:
tmp查看:
没有问题。
在root下可以查看特定用户的权限:
第一条可以不看,所有的用户都会有。
第二条GRANT ALL PRIVILEGES ON rootDB
.* TO ‘tmp’@‘%’,就是刚刚给tmp赋权的操作。
普通用户可以看自己有哪些权限:
但是不能看其他用户的:
剥夺权限
这里tmp有所有的权限,用tmp插入一下:
如果不想让这个用户进行插入,可以去掉其插入的权限,也就是说root可以剥夺普通用户的权限。
语法:
revoke 权限列表 on 库.对象名 from '用户名'@'登陆位置';
可以剥夺指定权限,比如说剥夺insert :
不能插入了,但是还是能查的:
再来查看一下当前的权限:
蹦出来了一堆。
因为刚刚是所有的权限都有,这里将一个insert权限去除,查的时候是不会有insert的,但是其他的权限还要显示。可以看到上面没有insert。
也可以直接剥夺所有权限:
此时tmp用户就看不到rootDB库了:
show一下:
没有任何权限。
这就是用户管理,看了这篇之后就可以用root创建一个用户,然后用root创建一个库,给新用户赋权,后续就可以用这个普通用户来进行对特定库的操作了,相对来说更加安全。
到此结束。。。