【MySQL】第十八弹---数据库管理基础:视图操作与用户权限管理指南

✨个人主页:熬夜学编程的小林

💗系列专栏: 【C语言详解】 【数据结构详解】【C++详解】【Linux系统编程】【MySQL】

目录

1、视图

1.1、基本使用

1.1.1、创建视图

1.1.2、修改视图

1.1.3、删除视图

1.2、视图规则和限制

2、用户管理

[2.1 用户](#2.1 用户)

2.1.1、用户信息

2.1.2、创建用户

[2.1.3 删除用户](#2.1.3 删除用户)

[2.1.4 修改用户密码](#2.1.4 修改用户密码)

2.2、数据库的权限

2.2.1、给用户授权

2.2.2、回收权限


1、视图

视图是一个虚拟表,其内容由查询定义 。同真实的表一样,视图包含一系列带有名称的列和行数据视图的数据变化会影响到基表,基表的数据变化也会影响到视图

1.1、基本使用

注意:此处使用以前的scott数据库,内部有dept,emp,salgrade表!

1.1.1、创建视图

复制代码
create view 视图名 as select语句;

案例

先在emp和dept表中查询ename和对应的dname!

复制代码
select ename,dname from emp,dept where emp.deptno=dept.deptno;
+--------+------------+
| ename  | dname      |
+--------+------------+
| SMITH  | RESEARCH   |
| ALLEN  | SALES      |
| WARD   | SALES      |
| JONES  | RESEARCH   |
| MARTIN | SALES      |
| BLAKE  | SALES      |
| CLARK  | ACCOUNTING |
| SCOTT  | RESEARCH   |
| KING   | ACCOUNTING |
| TURNER | SALES      |
| ADAMS  | RESEARCH   |
| JAMES  | SALES      |
| FORD   | RESEARCH   |
| MILLER | ACCOUNTING |
+--------+------------+

将该表创建成视图,便于以后查询!

复制代码
-- 将ename和dname的表创建成视图
create view myview as select ename,dname from emp,dept where emp.deptno=dept.deptno;

-- 查看视图的数据
select * from myview;
+--------+------------+
| ename  | dname      |
+--------+------------+
| SMITH  | RESEARCH   |
| ALLEN  | SALES      |
| WARD   | SALES      |
| JONES  | RESEARCH   |
| MARTIN | SALES      |
| BLAKE  | SALES      |
| CLARK  | ACCOUNTING |
| SCOTT  | RESEARCH   |
| KING   | ACCOUNTING |
| TURNER | SALES      |
| ADAMS  | RESEARCH   |
| JAMES  | SALES      |
| FORD   | RESEARCH   |
| MILLER | ACCOUNTING |
+--------+------------+

1.1.2、修改视图

修改了视图,对基表数据有影响

复制代码
-- 将dname=RESEARCH的dname修改成zhangsan
update myview set ename='zhangsan' where dname='RESEARCH';

-- 查看视图数据
select * from myview;

-- 查看基表数据
select ename,dname from emp,dept where emp.deptno=dept.deptno;

基表

视图

修改了基表,对视图有影响

1.1.3、删除视图

复制代码
drop view 视图名;

1.2、视图规则和限制

  • 与表一样,必须唯一命名(不能出现同名视图或表名)
  • 创建视图数目无限制,但要考虑复杂查询创建为视图之后的性能影响
  • 视图不能添加索引,也不能有关联的触发器或者默认值
  • 视图可以提高安全性,必须具有足够的访问权限
  • order by 可以用在视图中,但是如果从该视图检索数据 select 中也含有 order by ,那么该视图中的 order by 将被覆盖
  • 视图可以和表一起使用

2、用户管理

如果我们只能使用root用户,这样存在安全隐患。这时,就需要使用MySQL的用户管理。

2.1 用户

2.1.1、用户信息

MySQL中的用户,都存储在系统数据库mysql的user表中

复制代码
use mysql; -- 使用mysql数据库
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed -- 数据库修改成功

mysql> select host,user,authentication_string from user;
+-----------+------------------+------------------------------------------------------------------------+
| host      | user             | authentication_string                                                  |
+-----------+------------------+------------------------------------------------------------------------+
BotS<Ml<ost | debian-sys-maint | $A$005$vQ8[rjH1mSXUgfOEkrk505LdSeXca7oqgwdiGe/cSJXNEHb8 |
| localhost | mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | mysql.session    | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | mysql.sys        | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | root             | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9                              |
+-----------+------------------+------------------------------------------------------------------------+
5 rows in set (0.00 sec)

字段解释:

  • host : 表示这个用户可以从哪个主机登陆,如果是localhost,表示只能从本机登陆
  • user用户名
  • authentication_string用户密码通过password函数加密后的
  • *_priv用户拥有的权限

2.1.2、创建用户

语法:

复制代码
create user '用户名'@'登陆主机/ip' identified by '密码';

案例:

复制代码
create user 'jkl'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.01 sec)


select user,host,authentication_string from user;
+------------------+-----------+------------------------------------------------------------------------+
| user             | host      | authentication_string                                                  |
+------------------+-----------+------------------------------------------------------------------------+
BotS<Ml<-sys-maint | localhost | $A$005$vQ8[rjH1mSXUgfOEkrk505LdSeXca7oqgwdiGe/cSJXNEHb8 |
| jkl              | localhost | $A$005$K2uSwORC{yhG:YcLCh89Q3WKUPfJR2zTuO8QgaEQbBs4QWt1d5wf58CgF1 |
| mysql.infoschema | localhost | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| mysql.session    | localhost | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| mysql.sys        | localhost | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| root             | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9                              |
+------------------+-----------+------------------------------------------------------------------------+
6 rows in set (0.01 sec)

2.1.3 删除用户

语法:

复制代码
drop user '用户名'@'主机名'

示例:

复制代码
select user,host,authentication_string from user;
+------------------+-----------+------------------------------------------------------------------------+
| user             | host      | authentication_string                                                  |
+------------------+-----------+------------------------------------------------------------------------+
BotS<Ml<-sys-maint | localhost | $A$005$vQ8[rjH1mSXUgfOEkrk505LdSeXca7oqgwdiGe/cSJXNEHb8 |
| jkl              | localhost | $A$005$K2uSwORC{yhG:YcLCh89Q3WKUPfJR2zTuO8QgaEQbBs4QWt1d5wf58CgF1 |
| mysql.infoschema | localhost | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| mysql.session    | localhost | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| mysql.sys        | localhost | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| root             | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9                              |
+------------------+-----------+------------------------------------------------------------------------+
6 rows in set (0.01 sec)

drop user jkl; -- 尝试删除用户
ERROR 1396 (HY000): Operation DROP USER failed for 'jkl'@'%'
-- 直接给个用户名,不能删除,它默认是%,表示所有地方可以登陆的用户

drop user 'jkl'@'localhost'; -- 删除用户
Query OK, 0 rows affected (0.01 sec)

mysql> select user,host,authentication_string from user;
+------------------+-----------+------------------------------------------------------------------------+
| user             | host      | authentication_string                                                  |
+------------------+-----------+------------------------------------------------------------------------+
BotS<Ml<-sys-maint | localhost | $A$005$vQ8[rjH1mSXUgfOEkrk505LdSeXca7oqgwdiGe/cSJXNEHb8 |
| mysql.infoschema | localhost | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| mysql.session    | localhost | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| mysql.sys        | localhost | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| root             | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9                              |
+------------------+-----------+------------------------------------------------------------------------+
5 rows in set (0.00 sec)

2.1.4 修改用户密码

语法:

  • 自己改自己密码

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

  • root用户修改指定用户的密码

    set password for '用户名'@'主机名'=password('新的密码');

注意 :上面的语句需要在MySQL 5.7.6版本以下 才能使用**。**

后序版本能够使用的修改密码语法:

复制代码
alter user 'username'@'host' identified by '新的密码';

2.2、数据库的权限

MySQL数据库提供的权限列表:

2.2.1、给用户授权

刚创建的用户没有任何权限。需要给用户授权。

语法:

复制代码
grant 权限列表 on 库.对象名 to '用户名'@'登陆位置' [identified by '密码']

说明:

  • 权限列表,多个权限用逗号分开

    grant select on ...
    grant select, delete, create on ....
    grant all [privileges] on ... -- 表示赋予该用户在该对象上的所有权限

  • *.* : 代表本系统中的所有数据库的所有对象(表,视图,存储过程等)

  • 库.* : 表示某个数据库中的所有数据对象(表,视图,存储过程等)

  • identified by可选。 如果用户存在,赋予权限的同时修改密码,如果该用户不存在,就是创建用户

案例:

复制代码
-- 使用root账号
-- 终端A
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)
mysql> use test;
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| account        |
| student        |
| user           |
+----------------+
3 rows in set (0.01 sec)

--给用户jkl赋予test数据库下所有文件的select权限
mysql> grant select on test.* to 'whb'@'localhost';  
Query OK, 0 rows affected (0.01 sec)

--使用jkl账号
--终端B
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)

--暂停等root用户给whb赋完权之后,在查看
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| test               |  --赋完权之后,就能看到新的表
+--------------------+
2 rows in set (0.01 sec)

mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| account        |
| student        |
| user           |
+----------------+
3 rows in set (0.00 sec)
mysql> select * from account;
+----+--------+---------+
| id | name   | blance  |
+----+--------+---------+
|  2 | 李四   |  321.00 |
|  3 | 王五   | 5432.00 |
|  4 | 赵六   |  543.90 |
|  5 | 赵六   |  543.90 |
+----+--------+---------+
4 rows in set (0.00 sec)
--没有删除权限
mysql> delete  from account;
ERROR 1142 (42000): DELETE command denied to user 'whb'@'localhost' for table
'account'

特定用户现有查看权限:

复制代码
show grants for 'jkl'@'localhost';
+-----------------------------------------------+
| Grants for jkl@localhost                      |
+-----------------------------------------------+
| GRANT USAGE ON *.* TO `jkl`@`localhost`       |
| GRANT SELECT ON `test`.* TO `jkl`@`localhost` |
+-----------------------------------------------+
2 rows in set (0.00 sec)

注意:如果发现赋权限后,没有生效,执行如下指令:

复制代码
flush privileges;

2.2.2、回收权限

语法:

复制代码
revoke 权限列表 on 库.对象名 from '用户名'@'登陆位置';

示例:

复制代码
-- 回收jkl对test数据库的所有权限
--root身份,终端A
mysql> revoke all on test.* from 'jkl'@'localhost';
Query OK, 0 rows affected (0.00 sec)
--jkl身份,终端B
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| test               |
+--------------------+
2 rows in set (0.00 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)
相关推荐
Blue.ztl41 分钟前
菜鸟之路day31一一MySQL之多表设计
android·数据库·mysql
爬树的小蚂蚁3 小时前
Linux 修改bond后网关不生效的问题
linux·运维·服务器
洁洁!3 小时前
从零开始在亚马逊云科技 EC2上部署DeepSeek R1大语言模型:完整实战指南
服务器·科技·语言模型
程序员拂雨6 小时前
MongoDB知识框架
数据库·mongodb
风行無痕6 小时前
Ubuntu Linux系统配置账号无密码sudo
linux·服务器·ubuntu
消失在人海中7 小时前
oracle 会话管理
数据库·oracle
爆农7 小时前
centos搭建dokcer和vulhub
linux·运维·centos
SZ1701102317 小时前
中继器的作用
服务器·网络·智能路由器
chenxy027 小时前
如何快速分享服务器上的文件
运维·服务器
Wyc724098 小时前
JDBC:java与数据库连接,Maven,MyBatis
java·开发语言·数据库