MySQL中的视图特性和用户权限管理详解
1:MySQL视图
1:什么是视图
视图是一个虚拟表,其内容由一条 SELECT 查询语句定义。它本身不存储数据,所有数据都来自于底层的 "基表"。
核心特性:数据双向联动
- 修改视图中的可更新数据,会直接影响基表
- 基表的数据发生变化,视图的查询结果也会实时更新
主要作用:
- 简化复杂的多表查询,将常用查询封装为视图
- 隐藏基表的敏感字段(如密码、薪资),提升数据安全性
- 实现数据隔离,不同用户只能看到自己权限内的数据
2:视图基本操作
1:创建员工表
-- 创建部门表
CREATE TABLE DEPT (
deptno INT PRIMARY KEY,
dname VARCHAR(20),
loc VARCHAR(20)
);
-- 创建员工表
CREATE TABLE EMP (
empno INT PRIMARY KEY,
ename VARCHAR(20),
job VARCHAR(20),
mgr INT,
hiredate DATE,
sal DECIMAL(7,2),
comm DECIMAL(7,2),
deptno INT,
FOREIGN KEY (deptno) REFERENCES DEPT(deptno)
);
-- 插入测试数据
INSERT INTO DEPT VALUES
(10, 'ACCOUNTING', 'NEW YORK'),
(20, 'RESEARCH', 'DALLAS'),
(30, 'SALES', 'CHICAGO'),
(40, 'OPERATIONS', 'BOSTON');
INSERT INTO EMP VALUES
(7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, NULL, 20),
(7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30),
(7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30),
(7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, NULL, 20),
(7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30),
(7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, NULL, 30),
(7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, NULL, 10),
(7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, NULL, 20),
(7839, 'KING', 'PRESIDENT', NULL, '1981-11-17', 5000, NULL, 10),
(7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30),
(7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, NULL, 20),
(7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, NULL, 30),
(7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, NULL, 20),
(7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, NULL, 10);2:创建视图并查询
-- 创建视图 CREATE VIEW v_ename_dname AS SELECT e.ename, d.dname FROM EMP e JOIN DEPT d ON e.deptno = d.deptno; -- 查询视图(和查询普通表语法完全一致) SELECT * FROM v_ename_dname ORDER BY dname;

视图本质是保存了一条 SELECT 语句,每次查询视图都会执行这条语句并返回结果。
3:修改视图数据,验证对基表的影响
-- 先查看基表中CLARK的信息 SELECT ename FROM EMP WHERE ename = 'CLARK'; -- 结果:CLARK -- 修改视图中的数据 UPDATE v_ename_dname SET ename = 'TEST' WHERE ename = 'CLARK'; -- 再次查看基表 SELECT ename FROM EMP WHERE ename = 'CLARK'; -- 无结果 SELECT ename FROM EMP WHERE ename = 'TEST'; -- 结果:TEST

可更新视图的修改会直接作用于底层基表。
4:修改基表数据,验证对视图的影响
-- 修改基表中JAMES的部门编号 UPDATE EMP SET deptno = 10 WHERE ename = 'JAMES'; -- 查询视图中JAMES的部门 SELECT * FROM v_ename_dname WHERE ename = 'JAMES';

基表数据变化会实时反映在视图中,因为视图是动态查询的。
5:删除视图
-- 删除视图 DROP VIEW v_ename_dname; -- 验证删除 SHOW TABLES; -- 视图不再出现在列表中

3:视图的规则与限制
- 命名唯一:视图名不能和已有表或视图重名
- 性能影响:基于复杂查询创建的视图,每次查询都会执行复杂 SQL,注意性能优化
- 无索引 / 触发器:视图不能创建索引,也不能关联触发器或设置默认值
- 权限控制:可以给不同用户分配不同视图的权限,实现数据隔离
- ORDER BY 覆盖:如果查询视图时也指定了 ORDER BY,视图定义中的 ORDER BY 会被覆盖
- 可更新限制:包含以下内容的视图不可更新:
- 聚合函数(SUM、COUNT、AVG 等)
- GROUP BY、HAVING、UNION、DISTINCT
- 子查询、多表 JOIN(部分简单 JOIN 可更新)
2:MySQL用户管理与权限控制
1:为什么需要用户管理
- root 用户拥有所有权限,日常使用存在极大安全风险
- 多用户协作场景下,需要给不同角色分配不同权限(如开发只能查测试库,运维有生产库权限)
- 遵循最小权限原则:只给用户完成工作所需的最小权限
2:MySQL用户信息存储
MySQL 的所有用户信息都存储在系统数据库 mysql的user 表中,核心字段如下:
| 字段 | 含义 |
|---|---|
host | 允许该用户登录的主机地址- localhost:只能从本机登录- %:任意主机- 192.168.1.%:指定网段 |
user | 用户名 |
authentication_string | 经过 password 函数加密后的用户密码 |
*_priv | 各种权限字段(如 Select_priv、Insert_priv 等) |
查看所有用户:
USE mysql; SELECT host, user, authentication_string FROM user;

3:用户基本操作
所有实验均使用 root 用户登录 MySQL 执行
1:创建新用户
-- 创建只能从本机登录的用户dev,密码为Dev@123456 CREATE USER 'dev'@'localhost' IDENTIFIED BY 'Dev@123456'; -- 验证用户创建成功 SELECT host, user FROM mysql.user WHERE user = 'dev';
常见错误
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
原因:MySQL 默认开启密码复杂度验证,要求密码长度≥8,包含大小写字母、数字和特殊字符。解决:使用符合要求的强密码(生产环境禁止关闭密码验证)。
2:删除用户
-- 错误写法(默认匹配%主机,会报错) DROP USER dev; -- ERROR 1396 (HY000): Operation DROP USER failed for 'dev'@'%' -- 正确写法(必须完整指定'用户名'@'主机') DROP USER 'dev'@'localhost';
MySQL 用户是'用户名'@'主机'的组合,两者共同唯一标识一个用户。
3:修改用户密码
-- 1. 用户自己修改自己的密码
SET PASSWORD = PASSWORD('NewDev@123456');
-- 2. root用户修改指定用户的密码
SET PASSWORD FOR 'dev'@'localhost' = PASSWORD('RootSet@123456');退出 MySQL,使用新密码登录 dev 用户。
4:权限管理
1:给用户授权
-- 1. 授予dev用户test库所有表的查询权限 GRANT SELECT ON test.* TO 'dev'@'localhost'; -- 2. 授予dev用户test库所有表的增删改查权限 GRANT SELECT, INSERT, UPDATE, DELETE ON test.* TO 'dev'@'localhost'; -- 3. 授予所有库所有权限(生产环境绝对禁止!) -- GRANT ALL PRIVILEGES ON *.* TO 'dev'@'localhost'; -- 查看用户权限 SHOW GRANTS FOR 'dev'@'localhost'; -- 权限生效(如果授权后不生效,执行此命令) FLUSH PRIVILEGES;
登录

-- 查看数据库(应该能看到test库) SHOW DATABASES; -- 查询test库的表 USE test; SHOW TABLES; -- 执行查询(成功) SELECT * FROM account; -- 执行删除(如果只给了SELECT权限,会报错) DELETE FROM account; -- ERROR 1142 (42000): DELETE command denied to user 'dev'@'localhost' for table 'account'
2:回收用户权限
-- 回收dev用户对test库的所有权限 REVOKE ALL ON test.* FROM 'dev'@'localhost'; -- 验证:dev用户执行show databases,只能看到information_schema库 -- 查看权限 SHOW GRANTS FOR 'dev'@'localhost'; -- 显示 GRANT USAGE ON *.* TO 'dev'@'localhost'(USAGE表示无任何权限)
5:常见权限说明
| 权限类别 | 权限名称 | 说明 |
|---|---|---|
| 数据操作 | SELECT | 查询数据 |
| INSERT | 插入数据 | |
| UPDATE | 更新数据 | |
| DELETE | 删除数据 | |
| 结构操作 | CREATE | 创建数据库、表、索引 |
| DROP | 删除数据库、表、视图 | |
| ALTER | 修改表结构 | |
| 视图相关 | CREATE VIEW | 创建视图 |
| SHOW VIEW | 查看视图定义 | |
| 管理权限 | CREATE USER | 创建用户 |
| GRANT OPTION | 将自己的权限授予其他用户 | |
| SHOW DATABASES | 查看所有数据库 |
6:安全实践
- 禁止使用 root 用户进行日常操作,为每个用户创建独立账号
- 不要创建
'user'@'%'这样允许任意主机登录的用户,限制登录 IP - 严格遵循最小权限原则,只给用户完成工作所需的最小权限
- 定期修改密码,使用包含大小写、数字、特殊字符的强密码
- 及时删除不再使用的用户,避免遗留安全隐患
- 通过视图实现列级权限控制,不要直接给用户基表的查询权限
到此这篇关于MySQL中的视图特性和用户权限管理详解的文章就介绍到这了,更多相关mysql视图特性和用户权限管理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
完美解决MySQL通过localhost无法连接数据库的问题
下面小编就为大家带来一篇完美解决MySQL通过localhost无法连接数据库的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-02-02
解决Mysql建表时报错invalid ON UPDATE clause for 'create_d
这篇文章主要介绍了解决Mysql建表时报错invalid ON UPDATE clause for 'create_date' column问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2023-12-12


最新评论