【MySQL】从视图到用户和权限管理
2025-11-13 17:46:27
文章摘要
本文介绍MySQL视图与用户权限管理核心内容:视图是基于基础表/视图的虚拟表,无物理存储,含创建(两种语法)、查询、修改(受聚合函数等限制)、删除语法,具有简单、安全等优点;默认root用户可操作所有数据库,新建用户需指定用户名、主机(需注意安全设置);权限分层级(全局至列级),含数据/结构/管理类权限,需按需分配,新权限需重连生效,遵循最小权限原则保障安全。




一:视图的定义


> 视图是⼀个虚拟的表,它是基于⼀个或多个基本表或其他视图的查询结果集。视图本⾝不存储数据,⽽是通过执⾏查询来动态⽣成数据。⽤⼾可以像操作普通表⼀样使⽤视图进⾏查询、更新和管理。视图本⾝并不占⽤物理存储空间,它仅仅是⼀个查询的逻辑表⽰,物理上它依赖于基础表中的数据。


那么该怎么创建视图呢?跟创建表时差不多


```sql
CREATE VIEW view_name [(column_list)] AS select_statement
```


二:创建好了那么该如何使用我们的视图以及视图的一些操作


> 例如:查询用户的所有信息和考试成绩


```sql
select
s.id, s.name, s.sno, s.age, s.gender, s.enroll_date,
c.id, c.`name`,
co.id, co.`name`,
sc.id, sc.score
from student s, class c, course co, score sc
where s.class_id = c.id
and sc.student_id = s.id
and sc.course_id = co.id
order by s.id;
```


> 创建视图,在select中使⽤别名


```sql
create view v_student_socre as
select s.id, s.name, s.sno, s.age, s.gender, s.enroll_date,
c.id as class_id, c.`name` as class_name,
co.id as course_id, co.`name` as course_name, sc.id as score_id, sc.score
from student s, class c, course co, score sc
where s.class_id = c.id
and sc.student_id = s.id
and sc.course_id = co.id
order by s.id;
```


> 创建视图,指定结果集中的列名


```sql
create view v_student_socre_v1
(id, name, sno, age, gender, enroll_date,
class_id, class_name,
course_id, course_name,
score_id, score) as
select s.id, s.name, s.sno, s.age, s.gender, s.enroll_date, c.id, c.`name`,
co.id, co.`name`, sc.id, sc.score from student s, class c, course co, score sc
where s.class_id = c.id
and sc.student_id = s.id
and sc.course_id = co.id;
```


> 最后查询视图


```sql
select * from v_student_socre;
```


```sql
select * from v_student_socre_v1;
```

但是要注意的是通过真实表修改数据,会影响视图


> 当我们修改唐三藏的JAVA成绩为99分


我们再次查看视图时,发现唐三藏这条记录已被修改


> 同样的是通过视图修改数据也会影响基表


当我们修改唐三藏的计算机⽹络成绩为99分


```sql
update v_student_socre set score = 99 where score_id = 3;
```


可以发现更新失败,因为创建视图时使⽤了order by 语句

小编整理了视图修改会受到影响的点

- 创建视图时使⽤聚合函数的视图

- 创建视图时使⽤ DISTINCT

- 创建视图时使⽤ GROUP BY 以及 HAVING ⼦句

- 创建视图时使⽤ UNION 或 UNION ALL

- 查询列表中使⽤⼦查询

- 在FROM⼦句中引⽤不可更新视图


你要删除视图的话可以使用


```sql
drop view view_name;
```

相信很多人很期待那么视图有哪些优点呢?我将一一列举

视图的优点

1. 简单性:视图可以将复杂的查询封装成⼀个简单的查询。例如,针对⼀个复杂的多表连接查询,可

以创建⼀个视图,⽤⼾只需查询视图⽽⽆需了解底层的复杂逻辑。

2. 安全性:通过视图,可以隐藏表中的敏感数据。例如,⼀个系统的⽤⼾表中,可以创建⼀个不包含

密码列视图,普通⽤⼾只能访问这个视图,⽽不能访问原始表。

3. 逻辑数据独⽴性:视图提供了⼀种逻辑数据独⽴性,即使底层表结构发⽣变化,只需修改视图定

义,⽽⽆需修改依赖视图的应⽤程序。使⽤到应⽤程序与数据库的解耦

4. 重命名列:视图允许⽤⼾重命名列名,以增强数据可读性。

三:用户

数据库服务安装成功后默认有⼀个root⽤⼾,可以新建和操纵数据库服务中管理的所有数据库。在真实的使⽤过程中,通常每个应⽤对应着⼀个数据库,我们只希望某个⽤⼾只能操纵和管理当前应⽤对应的那个数据库,⽽不能操纵和管理其他应⽤的数据库,这时就可以添加⼀个⽤⼾并指定⽤⼾的权限

以这张图片为例

root 可以访问和操纵所有的数据库:DB1, DB2, DB3, DB4

普通用户1 只能访问和操纵数据库DB1

 普通用户2 只能访问和操纵数据库DB3

只读用户1 只能访问数据库DB3

只读用户2 只能访问数据库DB4


> host: 允许登录的主机,相当于⽩名单,如果是localhost,表⽰只能从本机登陆

> user: ⽤⼾名

> *_priv:⽤⼾拥有的权限

> authentication_string: 加密后的⽤⼾密码


接下来开始创建我们的用户


```sql
CREATE USER [IF NOT EXISTS] 'user_name'@'host_name' IDENTIFIED BY
'auth_string';
```

user_name: ⽤⼾名,⽤单引号包裹,区分⼤⼩写

host_name: 主机或IP(段),⽤单引号包裹

auth_string: 真实密码,有些密码策略不允许使⽤简单密码






这里需要的注意的是


> 如果不指定host_name相当于'user_name'@'%',%表⽰所有主机都可以连接到数据库,强烈建议不要这样设置,因为会导致严重的安全问题

>


> user_name和host_name分别⽤单引号包裹,如果写成 'user_name @host_name',相当

> 'user_name@host_name'@'%



host_name可以通过⼦⽹掩码设置主机范围

- 198.0.0.0/255.0.0.0 : A段⽹络中的任意⼀台主机

- 198.51.0.0/255.255.0.0: 198.51 B段⽹络中的任意⼀台主机

- 198.51.100.0/255.255.255.0: 198.51.100 C段⽹络中的任意⼀台主机

- 198.51.100.1 :只包含特定IP地址的主机


> 从MySQL 8.0.23开始,指定为IPv4地址的主机值可以使⽤CIDR表⽰法写⼊,例如198.51.100.44/24



> • 允许在IP地址中使⽤%通配符,⽐如,主机值'%'匹配任何主机名, 198.51.100.% 匹配198.51.100C段⽹络中的任何主机。MySQL 8.0.35中已弃⽤,以后可能会删除





四:权限管理

内置的一些权限如下图所示:


1. 权限层级关系:

   - 全局权限(`*.*`)覆盖数据库权限(`db.*`)

   - 数据库权限覆盖表级权限(`db.table`)

   - 表级权限覆盖列级权限(`db.table(column)`)

   - 权限遵循"最小权限原则",应按需分配最窄范围的权限


2. 常用权限说明:

   - 数据操作:`SELECT`(查询)、`INSERT`(插入)、`UPDATE`(更新)、`DELETE`(删除)

   - 结构操作:`CREATE`(创建)、`ALTER`(修改)、`DROP`(删除)

   - 管理权限:`GRANT OPTION`(授权他人)、`SUPER`(超级权限)、`SHUTDOWN`(关闭服务)


3. 权限生效机制:

   - 新授予的权限对已有连接不生效,需重新连接

   - `FLUSH PRIVILEGES` 命令用于从权限表重新加载权限设置

   - 推荐通过 `GRANT/REVOKE` 操作权限,而非直接修改 `mysql` 系统库表


4. 安全建议:

   - 避免给普通用户授予 `DROP`、`ALTER` 等危险权限

   - 限制 `GRANT OPTION` 权限的使用,防止权限扩散

   - 定期审计权限,移除不再需要的权限

   - 敏感操作(如删除表)建议使用专门的管理员账号执行


通过以上操作,可以实现对 MySQL 用户权限的精细化管理,确保数据库操作的安全性和可控性。


声明:该内容由作者自行发布,观点内容仅供参考,不代表平台立场;如有侵权,请联系平台删除。