文章目录
- 1 :peach:视图:peach:
- 1.1 :apple:基本使用:apple:
- 1.1.1 :lemon:创建视图:lemon:
- 1.1.2 :lemon:案例:lemon:
- 1.1.3 :lemon:删除视图:lemon:
- 1.2 :apple:视图规则和限制:apple:
- 2 :peach:用户管理:peach:
- 2.1 :apple:用户信息:apple:
- 2.2 :apple:创建用户:apple:
- 2.3 :apple:删除用户:apple:
- 2.4 :apple:修改用户密码:apple:
- 2.5 :apple:数据库的权限:apple:
- 2.5.1 :lemon:给用户授权:lemon:
- 2.5.2 :lemon:回收权限:lemon:
1 🍑视图🍑
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。
1.1 🍎基本使用🍎
1.1.1 🍋创建视图🍋
create view 视图名 as select语句
1.1.2 🍋案例🍋
create view v_ename_dname as select ename, dname
from EMP, DEPT where EMP.deptno=DEPT.deptno;
查看v_ename_dname
:
select * from v_ename_dname order by dname;
+--------+------------+
| ename | dname |
+--------+------------+
| CLARK | ACCOUNTING |
| KING | ACCOUNTING |
| MILLER | ACCOUNTING |
| SMITH | RESEARCH |
| JONES | RESEARCH |
| SCOTT | RESEARCH |
| ADAMS | RESEARCH |
| FORD | RESEARCH |
| ALLEN | SALES |
| WARD | SALES |
| MARTIN | SALES |
| BLAKE | SALES |
| TURNER | SALES |
| JAMES | SALES |
+--------+------------+
修改了视图,对基表数据有影响:
select emp.ename,dept.dname,dept.deptno from emp,dept where
emp.deptno=dept.deptno order by dname;
update v_ename_dname set ename='TEST' where ename='CLARK';
select * from EMP where ename='CLARK';
select * from EMP where ename='TEST';
修改了基表,对视图有影响:
mysql> update EMP set deptno=10 where ename='JAMES'; -- 修改基表
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from v_ename_dname where ename='JAMES';
+-------+----------+
| ename | dname |
+-------+----------+
| JAMES | RESEARCH | <== 视图中的数据也发生了变化
+-------+----------+
1.1.3 🍋删除视图🍋
drop view 视图名
1.2 🍎视图规则和限制🍎
- 与表一样,必须唯一命名(不能出现同名视图或表名);
- 创建视图数目无限制,但要考虑复杂查询创建为视图之后的性能影响;
- 视图不能添加索引,也不能有关联的触发器或者默认值;
- 视图可以提高安全性,必须具有足够的访问权限;
- order by 可以用在视图中,但是如果从该视图检索数据 select 中也含有 order by ,那么该视图中的 order by 将被覆盖;
- 视图可以和表一起使用;
2 🍑用户管理🍑
2.1 🍎用户信息🍎
MySQL中的用户,都存储在系统数据库mysql
的user
表中:
字段解释:
- host: 表示这个用户可以从哪个主机登陆,如果是
localhost
,表示只能从本机登陆; - user: 用户名;
- authentication_string: 用户密码通过
password
函数加密后的;
2.2 🍎创建用户🍎
create user '用户名'@'登陆主机/ip' identified by '密码';
案例:
比如我们创建一个grm的用户,并且只允许该用户在本地登录:
此时再查看user表中内容:
所以现在我们就可以使用普通用户的身份进行登录了。
2.3 🍎删除用户🍎
语法:
drop user '用户名'@'主机名'
这里我就不删除了。
2.4 🍎修改用户密码🍎
语法:
- 自己改自己密码:
set password=password('新的密码');
- root用户修改指定用户的密码:
set password for '用户名'@'主机名'=password('新的密码');
2.5 🍎数据库的权限🍎
由于前面我们已经创建了普通用户grm,所以当我们使用普通用户的身份去查看当前存在哪些数据库的时候:
我们惊讶的发现居然只有一个数据库,之前不是创建了很多数据库的吗?其实这就是权限问题了,之前的数据库全部都是在root用户下创建的,而普通用户是没有root用户权限的,所以这也就导致了为什么在普通用户下看到的数据库要少些,那么我们应该采取怎样的措施呢?
2.5.1 🍋给用户授权🍋
语法:
grant 权限列表 on 库.对象名 to '用户名'@'登陆位置' [identified by '密码']
说明:
权限列表,多个权限用逗号分开:
grant select on ...
grant select, delete, create on ....
grant all [privileges] on ... -- 表示赋予该用户在该对象上的所有权限
*.*
: 代表本系统中的所有数据库的所有对象(表,视图,存储过程等);库.*
: 表示某个数据库中的所有数据对象(表,视图,存储过程等);identified by
可选。 如果用户存在,赋予权限的同时修改密码,如果该用户不存在,就是创建用户;
补充:MySQL数据库提供的权限列表
权限 | 列 | 上下文 |
---|---|---|
create | Create_priv | 数据库/表/索引 |
drop | Drop_priv | 数据库/表 |
grant option | Grant_priv | 数据库/表/保存的程序 |
references | References_priv | 数据库/表 |
alter | Alter_priv | 表 |
delete | Delete_priv | 表 |
index | Index_priv | 表 |
insert | Insert_priv | 表 |
select | Select_priv | 表 |
update | Update_priv | 表 |
create view | Create_view_priv | 视图 |
show view | Show_view_priv | 视图 |
使用all
将添加所有权限。
现在要给grm用户添加数据库db1所有表的select权限:
grant select on db1.* to 'grm'@'localhost';
此时在grm用户下就能够拥有对数据库db1所有表的select权限:
此刻想要在grm用户下向account表中插入数据是不被允许的,我们可以为grm用户增加向account表中插入的权限:
grant insert on db1.account to 'grm'@'localhost';
此时在grm用户下:
便能够插入数据啦!
当然还可以增加其他的权限,在上面列出的权限列表都可以增加。
那我们能够通过什么方式比较直观的看见grm用户的权限吗?
可以使用下面这种方式:
补充:当发现赋权限后,没有生效,执行指令flush privileges;
2.5.2 🍋回收权限🍋
语法:
revoke 权限列表 on 库.对象名 from '用户名'@'登陆位置';
但是要注意一点:当该用户没有该权限时而去回收该权限会报错。
我们可以使用all
回收所有权限,但是一般来说不会这么使用。
我们先向grm用户增加db1数据库中account表的所有权限,然后再去掉对account的select权限:
此时在grm用户下就不能够select account表中数据了: