MySQL视图与用户权限管理从入门到精通
1. 视图
1.1 视图的基本概念
想象一下,你面前有一张表格,但它并不真正存在于数据库的物理存储中,而是由查询语句动态生成的。这就是视图。你可以把它理解为一个“虚拟表”,它的数据来源于一个或多个基础表(或其他视图)的查询结果。用户可以对视图进行查询、更新等操作,就像操作一张普通的表一样。关键在于,视图本身不存储数据,它只是一个逻辑上的表示,其物理数据完全依赖于背后的基础表。
免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈
1.2 视图的基本操作
1.2.1 创建视图
create view 列名1,列名2,列名3 as select 查询语句...
这里,view 是创建视图的关键字。
1.2.2 使用视图
视图到底有什么用?来看一个典型的场景:保护敏感数据。
假设我们只想查询学生的姓名和总分,而不希望暴露其学号和单科成绩。如果直接查询真实表,虽然可以做到,但存在风险——任何有查询权限的人,都可以随时在SELECT语句里加上那些敏感字段。
# 使⽤真实表进⾏查询 select s.name, sum(sc.score) total from student s, score sc where s.id = sc.student_id group by sc.student_id order by s.id; -- 缺点:可以随时在select关键字后加上学号和各科成绩字段,会暴露学生信息,不安全
这时,视图的价值就体现出来了。我们可以创建一个“安全窗口”。
# 创建视图 create view v_student_total_points as select s.id, s.name, sum(sc.score) total from student s, score sc where s.id = sc.student_id group by s.id order by s.id; -- 使用视图进行查询 select * from v_student_total_points; +-----------+-------+ | name | total | +-----------+-------+ | 唐三藏 | 469 | | 孙悟空 | 179.5 | | 猪悟能 | 200 | | 沙悟净 | 218 | | 宋江 | 118 | | 武松 | 178 | | 李逹 | 172 | +-----------+-------+ -- 只能查询出姓名和总分,进一步保护了学生的个人信息
视图的另一个妙用是简化复杂查询。既然视图本质上是一张虚拟表,那么它自然可以参与表连接。
select * from v_student_total_points v, student s where v.id = s.id; -- 视图本质上是一张虚拟的表,所以可以用视图与真实表进行表连接查询
1.2.3 修改数据
视图与基础表的数据是联动的,这一点需要特别注意。
- 通过真实表修改数据,会影响视图
# 修改唐三藏的JA VA成绩为99分 update score set score = 99 where student_id = 1 and course_id = 1; # 查询视图,发现唐三藏这条记录已被修改 select * from v_student_socre;
- 通过视图修改数据会影响基表
# 更新视图 update v_student_socre_v1 set score = 99 where score_id = 3; # 查看真实表数据,发现已被修改 select * from score where student_id = 1 and course_id = 5;
核心注意事项:
1. 修改真实表会影响视图,修改视图同样也会影响真实表,它们是双向联通的。
2. 但并非所有视图都可以更新。以下几种情况创建的视图是“只读”的,无法通过它来修改底层数据:
-------创建视图时使用聚合函数的视图
-------创建视图时使用 DISTINCT
-------创建视图时使用 GROUP BY 以及 HA VING子句
-------创建视图时使用 UNION 或 UNION ALL
-------查询列表中使用子查询
-------在FROM子句中引用不可更新视图
1.2.4 删除视图
# 语法 drop view 视图名;
1.3 视图的优点
- 简单性:视图可以将复杂的多表连接、嵌套查询封装成一个简单的查询接口。用户无需理解底层复杂逻辑,直接查询视图即可。
- 安全性:这是视图最核心的用途之一。通过创建不包含敏感字段(如密码、薪资)的视图,可以精确控制用户能看到的数据范围,实现数据层面的访问控制。
- 逻辑数据独立性:当底层表结构因业务调整发生变化时,只要视图的查询结果保持不变,依赖该视图的应用程序就无需修改。这实现了应用与数据库的解耦。
- 重命名列:视图允许为查询结果中的列起一个更直观、更符合业务场景的别名,从而增强数据的可读性。
2. 用户与权限管理
数据库安装后,默认的root用户拥有至高无上的权力,可以管理所有数据库。但在实际生产环境中,这显然不是最佳实践。更合理的做法是:为每个应用或业务模块创建独立的数据库,并分配一个专属用户,该用户只能操作自己名下的数据库,无法越界访问其他数据。这就是用户与权限管理要解决的问题。

如上图所示,一个清晰的权限架构应该是这样的:
root 可以访问和操纵所有的数据库:DB1, DB2, DB3, DB4
普通用户1 只能访问和操纵数据库DB1
普通用户2 只能访问和操纵数据库DB3
只读用户1 只能访问数据库DB3
只读用户2 只能访问数据库DB4
2.1 用户
2.1.1 查看用户
所有用户信息都存储在mysql数据库的user表中。要查看用户,可以这样做:
-- 选择数据库 use mysql; -- 查看表结构 desc user; -- 查看用户表 select * from user;


这张表的关键字段含义如下:
host: 允许登录的主机IP或域名,相当于白名单。
localhost表示只能从数据库服务器本机登录。user: 用户名。
*_priv: 用户拥有的具体权限,
Y表示有,N表示无。authentication_string: 加密后的用户密码。
2.1.2 创建用户
create user if not exists 'user_name'@'host_name' identified by 'auth_string';
user_name: 用户名,用单引号包裹,区分大小写。host_name: 允许登录的主机或IP段,同样用单引号包裹。auth_string: 用户的明文密码(注意:某些数据库的密码策略可能禁止使用过于简单的密码)。
例如,创建一个用户名为zhuxulong,密码为123456,且只允许从IP172.20.109.85登录的账户:
create user if not exists 'zhuxulong'@'172.20.109.85' identified by '123456';

创建用户时的几个关键细节:
- 如果不指定
host_name,则默认为'%',意味着允许从任何主机连接。这存在严重的安全风险,强烈不建议在生产环境中这样设置。 user_name和host_name必须分别用单引号包裹。如果写成'user_name@host_name',数据库会将其整体视为一个用户名,主机部分则变成'%'。host_name支持使用子网掩码格式来指定一个IP范围,这在大规模部署中非常有用:A: 198.0.0.0 : A段网络中的任意一台主机
B: 198.51.0.0 B段网络中的任意一台主机’
C: 198.51.100.0 C段网络中的任意一台主机
D: 198.51.100.1 :只包含特定IP地址的主机
2.1.3 修改密码
# 为指定⽤⼾设置密码 【推荐】 ALTER USER 'user_name'@'host_name' IDENTIFIED BY 'auth_string'; # 为指定⽤⼾设置密码 SET PASSWORD FOR 'user_name'@'host_name' = 'auth_string'; # 为当前登录⽤⼾设置密码 SET PASSWORD = 'auth_string';
2.1.4 删除用户
DROP USER [IF EXISTS] 'user_name'@'host_name'[, ...];
2.2 权限与授权
创建用户只是第一步,新用户默认是“光杆司令”,没有任何操作权限。我们需要手动为其授权。MySQL内置了非常丰富的权限,下图是一个常见的权限列表:

2.2.1 给用户授权
授权的基本语法如下:
grant 权限名 on priv_level to 'user_name'@'host_name' [WITH GRANT OPTION]
- 权限名:参考上图中的
Privilege列,如SELECT,INSERT,ALL PRIVILEGES等。 - priv_level: 指定权限的作用范围。常见格式有:
*.*: 所有数据库的所有表(相当于root的部分权限)。db_name.*: 指定数据库下的所有表。db_name.tbl_name: 指定数据库的指定表。
- 'user_name'@'host_name': 指定被授权的用户。
- [WITH GRANT OPTION]: 可选。如果加上,表示允许该用户将自己获得的权限再授予其他用户。
示例:为我们刚才创建的zhuxulong用户授予test数据库中student表的查询(SELECT)权限。
grant select on test.student to 'zhuxulong'@'172.20.109.85';
2.2.2 回收用户授权
权限给出去,也能收回来。回收权限使用REVOKE语句。
revoke 权限名 on 数据库名.表名 from 'user_name'@'host_name';
总结
视图和用户权限管理是数据库安全与数据管理的两大基石。视图通过逻辑封装提供了数据安全、简化访问和结构独立的优雅方案;而精细化的用户与权限管理,则是践行“最小权限原则”、保障数据库安全运行的必备手段。将两者结合使用,能构建起既灵活又安全的数据访问体系。
相关攻略
1 视图 1 1 视图的基本概念 想象一下,你面前有一张表格,但它并不真正存在于数据库的物理存储中,而是由查询语句动态生成的。这就是视图。你可以把它理解为一个“虚拟表”,它的数据来源于一个或多个基础表(或其他视图)的查询结果。用户可以对视图进行查询、更新等操作,就像操作一张普通的表一样。关键在于,
MySQL并发更新同一行数据怎么办?利用乐观锁或分段更新优化 先说结论:最稳妥的方案,是优先采用带条件的 UPDATE 配合 ROW_COUNT() 检查,并结合 version 字段实现乐观锁。至于分段更新,它只在批量修正这类少数场景中作为兜底手段,绝不能替代核心的并发控制逻辑。 为什么不能指望
MySQL异构迁移:四大核心挑战与实战应对指南 直接说结论:一次成功的MySQL异构迁移,远不止是数据搬运。它更像是一次精密的“器官移植”,需要针对不同“组织”的特性进行预处理。整个过程可以归纳为四类核心问题的系统化处理:时间类型必须按UTC显式转换并规避自动更新陷阱;存储引擎切换应禁用简单的ALT
MySQL服务启动失败?别慌,先看懂error log在说什么 遇到MySQL服务启动失败,很多人的第一反应是重装或者四处搜索错误代码。其实,最直接、最准确的“故障诊断书”就在眼前——那就是MySQL的error log。问题在于,很多人要么找不到它,要么面对满屏的日志信息不知从何看起。今天,我们就
MySQL数据意外丢失该怎么找回:InnoDB事务日志RedoLog灾备原理 开门见山,先说一个核心结论:当数据库遭遇误删,很多人第一时间想到的REDO LOG,其实**并不能直接帮你“找回”数据**。无论是手滑执行了DROP DATABASE,还是跑错了DELETE FROM语句,指望REDO L
热门专题
热门推荐
ArDrive是什么 简单来说,ArDrive是一个承诺“一旦存入,永远留存”的文件存储服务。它由ArDrive公司打造,目标很明确:提供比传统网盘或硬盘更让人安心的数据安全级别。这背后的奥秘,在于它构建于Arwea ve之上——一个去中心化的区块链网络。这个网络的工作机制很巧妙:它会将你的数据复制
HealthAI产品介绍 在当今的企业运营中,员工的健康管理正从一个后勤议题,转变为核心的成本与效率命题。HealthAI健康云开放平台的诞生,恰恰是回应了这一关键需求。它是一款综合性的企业健康管理解决方案,其底层逻辑是通过先进的算法与数据洞察,帮助企业系统化、智能化地管理员工或客户的健康信息,让健
加密货币交易平台推荐: 欧易OKX: Binance币安: 火币Huobi: Gateio芝麻开门: 市场回暖的信号已经相当明确,2025年的空投季自然备受瞩目。这远不止是获取早期代币那么简单,它更像是一张深度参与Web3生态建设的入场券。想要捕获超额收益?秘诀无他,唯有提前布局与精准交互。 模块化
全球量产充电速度最快电车!领克10&10+正式开启预售:20 99万起 4月24日,领克汽车正式官宣,旗下全新中大型纯电运动轿车——领克10及其高性能版领克10+,启动全国预售。市场关注已久的售价悬念终于揭晓,预售价从20 99万元起。 具体来看,新车提供了多个配置版本以满足不同需求:701公里长续
Binance币安 欧易OKX ️ Huobi火币️ 市场情绪正在悄然转变。一种越来越强的共识是,比特币或许正站在新一轮大规模上涨周期的起点,如果历史规律再度上演,其价格目标将指向令人瞩目的20万至24万美元区间。 核心要点: 新一轮的“第三浪”上涨或推动比特币价格进入200,000至240,000





