本篇所讲的视图和我上一篇事务中所讲的读视图不是一个东西,二者没有任何关系,如果看过我前一篇博客的同学不要搞混了。
其实视图和用户管理本来是想着分开来说的,不过两个的内容都比较少,就直接放一块讲了。
视图其实很简单,理解是一个虚拟表,其内容由查询定义。
语法:
create view 视图名 as select语句;
当前这个库中有三张表,除了上面的dept和emp,还有一个salgrade,不过这个表后面用不上:
我前面讲过,建表对应到系统中就是在建文件:
这里存储引擎是InnoDB的,所以每个表对应两个文件,一个.frm为存储表结构的文件,一个.ibd为存储索引和数据的文件。
这里用emp和dept这两张表进行内连接,连接条件为两表中的deptno相等,取出其中的enmae列和dname列:
但是如果我想要高频的查找这两列数据的话,每次都要高很长的sql,比较麻烦,那么就可以用视图来创建一个虚拟的表结构:
可以看到创建一个视图就相当于是创建了一张表,我们可以对myview这个视图进行查看,用起来就像表一样:
不过这里创建视图后,只产生了一个.frm文件,也就是只有一个存储表结构的文件。
那存储表中数据的文件在哪里呢?
其实就是emp和dept的.ibd文件,视图和基表中的数据是同步的。
像emp表和dept表都是基表。
可以看到被修改了。
可以看到也修改了。
同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。
视图规则和限制
- 与表一样,必须唯一命名(不能出现同名视图或表名)
- 创建视图数目无限制,但要考虑复杂查询创建为视图之后的性能影响
- 视图不能添加索引,也不能有关联的触发器或者默认值
- 视图可以提高安全性,必须具有足够的访问权限
- 尽量不要在视图中用order by
- 视图可以和表一起使用
在数据库刚装好后会有几个库是自带的,比如说mysql、sys等:
这几个库中的表不要随便删,小心出问题,我记得我不久前把db_1整个库给删了,研究了半天,最后重新下了mysql才搞好的。
这些库中有很多表结构。
MySQL在登录的时候也要记录下来哪些用户允许使用MySQL,哪些用户不允许使用MySQL,而这些信息也是要在MySQL中的特定表结构中保存下来的,而这个表就是上图中mysql库中的user表:
看一下这个表中都有什么内容(里面的字段有点多,横着打印看不全,先截出来一部分):
图中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,但是这样比较麻烦。用%更方便一点,但是不推荐这样做。
所以说mysql支持远端登录,但是登录时要有远端账户才可以。
再说一下password函数,这其实就是一个hash函数,可以将一个字符串转换成一段定长字符串:
可以看到就算是相差一个字符,结果都会有很大变化。
库中存放的都是这些加密后的字符串,这样做就是为了防止数据库泄漏之后像密码这样的重要信息不会丢失。
设置密码的语法有两种,一种是自己给自己设置密码:
set password=password('新的密码');
还有一种是root用户修改指定用户的密码:
set password for '用户名'@'IP'=password('新密码');
不过Linux下不会回显密码,这里眼看不出来改没改密码,反正使用qwer登录的:
也可以直接让user对表中的authentication_string做修改:
也是可以登录的,这里改的是tmp,我直接远端登:
这里Windows下能看到有登录的密码有四个字符。
我在win下用tmp用户登录,查看库的时候只有部分库能够看到:
因为tmp没有其他库的权限,所以是看不到的。
因为root的权限很高。
普通用户想要看到库的话得要有对应的权限。
语法:
grant 权限列表 on 库.对象名 to '用户名'@'登陆位置' [identified by '密码'];
其中权限列表可以直接给all,也可以指定某些权限(一般都是CURD操作的权限)。
on库.对象名表示对哪个库下的哪张表进行赋权,如果想要对所有库下的所有表进行赋权就可以用*.*,如果想要对某个库下的所有表进行赋权可以用库名.*。
to表示给哪个用户赋权。
后面的identified by '密码’可以不用写。如果写了且用户存在,赋予权限的同时会修改密码,如果该用户不存在,就是创建用户。
还是和刚刚一样。
用root给tmp赋权刚刚的rootDB:
这里意思就是给rootDB库中的所有表赋权。
用root来插入两条记录:
没有问题。
第一条可以不看,所有的用户都会有。
第二条GRANT ALL PRIVILEGES ON rootDB
.* TO ‘tmp’@‘%’,就是刚刚给tmp赋权的操作。
如果不想让这个用户进行插入,可以去掉其插入的权限,也就是说root可以剥夺普通用户的权限。
语法:
revoke 权限列表 on 库.对象名 from '用户名'@'登陆位置';
蹦出来了一堆。
因为刚刚是所有的权限都有,这里将一个insert权限去除,查的时候是不会有insert的,但是其他的权限还要显示。可以看到上面没有insert。
也可以直接剥夺所有权限:
此时tmp用户就看不到rootDB库了:
这就是用户管理,看了这篇之后就可以用root创建一个用户,然后用root创建一个库,给新用户赋权,后续就可以用这个普通用户来进行对特定库的操作了,相对来说更加安全。
到此结束。。。