MySQL中的视图特性和用户权限管理详解

 更新时间:2026年05月21日 09:54:48   作者:思麟呀  
文章详细介绍了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:视图的规则与限制

  1. 命名唯一:视图名不能和已有表或视图重名
  2. 性能影响:基于复杂查询创建的视图,每次查询都会执行复杂 SQL,注意性能优化
  3. 无索引 / 触发器:视图不能创建索引,也不能关联触发器或设置默认值
  4. 权限控制:可以给不同用户分配不同视图的权限,实现数据隔离
  5. ORDER BY 覆盖:如果查询视图时也指定了 ORDER BY,视图定义中的 ORDER BY 会被覆盖
  6. 可更新限制:包含以下内容的视图不可更新:
    • 聚合函数(SUM、COUNT、AVG 等)
    • GROUP BY、HAVING、UNION、DISTINCT
    • 子查询、多表 JOIN(部分简单 JOIN 可更新)

2:MySQL用户管理与权限控制

1:为什么需要用户管理

  • root 用户拥有所有权限,日常使用存在极大安全风险
  • 多用户协作场景下,需要给不同角色分配不同权限(如开发只能查测试库,运维有生产库权限)
  • 遵循最小权限原则:只给用户完成工作所需的最小权限

2:MySQL用户信息存储

MySQL 的所有用户信息都存储在系统数据库 mysqluser 表中,核心字段如下:

字段含义
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 索引优化实战指南(从慢查询到高性能)

    MySQL 索引优化实战指南(从慢查询到高性能)

    本文详细讲解了MySQL索引的核心原理、创建原则、失效场景以及优化策略,通过SQL示例和执行计划分析,帮助开发者设计高效索引,提升查询性能,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • MySQL9.0新特性向量存储的使用

    MySQL9.0新特性向量存储的使用

    MySQL 9.0 正式版已经发布,其中一个亮点就是向量(VECTOR)数据类型的支持,本文主要介绍了MySQL9.0新特性向量存储的使用,感兴趣的可以了解一下
    2024-08-08
  • MySQL过滤数据操作方法梳理

    MySQL过滤数据操作方法梳理

    数据库表一般包含大量的数据,很少需要检索表中的所有行。通常只是根据特定的需要提取表数据的子集。因此检索所需数据时需要指定搜索条件,搜索条件也称为过滤条件
    2022-10-10
  • MYSQL中的json数据操作代码

    MYSQL中的json数据操作代码

    这篇文章主要介绍了MYSQL中的json数据操作,主要包括基础查询操作,JSON函数操作,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • mysql执行时间为负数的原因分析

    mysql执行时间为负数的原因分析

    今天看到有人把phpmyadmin中的执行时间出现负数的情况视为phpmyadmin的bug, 其实这种情况的本质是php中浮点数(float)的精度问题。
    2010-08-08
  • MySQL中字段类型为longtext的值导出后显示二进制串方式

    MySQL中字段类型为longtext的值导出后显示二进制串方式

    这篇文章主要介绍了MySQL中字段类型为longtext的值导出后显示二进制串方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • 详解MySQL事务的隔离级别与MVCC

    详解MySQL事务的隔离级别与MVCC

    这篇文章主要介绍了MySQL事务的隔离级别与MVCC的相关资料,帮助大家更好的理解和学习使用MySQL,感兴趣的朋友可以了解下
    2021-04-04
  • 详解MySQL数据库、表与完整性约束的定义(Create)

    详解MySQL数据库、表与完整性约束的定义(Create)

    这篇文章主要介绍了MySQL数据库、表与完整性约束的定义(Create),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-04-04
  • mysql 子查询的概述和分类及单行子查询功能实现

    mysql 子查询的概述和分类及单行子查询功能实现

    本文详细介绍了MySQL的子查询概念和应用,解释了子查询是在主查询中嵌套另一个查询,包括外查询和内查询,并从多个角度进行分类,文章还深入探讨了子查询的编写技巧和使用场景,对于学习和应用MySQL的人来说,这是一篇非常有价值的指南
    2024-10-10
  • SQL深入探究存储的过程

    SQL深入探究存储的过程

    存储过程是事先经经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于高效数据处理的效率是有好处的
    2023-01-01

最新评论