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同步ES的主流方案汇总

    MySQL同步ES的主流方案汇总

    在日常开发中,我们经常遇到这样的场景:MySQL作为核心数据库存储业务数据,而Elasticsearch(ES)则承担着全文检索和数据分析的重任,如何让MySQL和ES保持数据一致性,成了每个后端工程师都绕不开的问题,所以本文给大家介绍了MySQL同步ES的5种主流方案
    2026-03-03
  • mysql数据库和oracle数据库之间互相导入备份

    mysql数据库和oracle数据库之间互相导入备份

    今天小编就为大家分享一篇关于mysql数据库和oracle数据库之间互相导入备份,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • MySQL Innodb表导致死锁日志情况分析与归纳

    MySQL Innodb表导致死锁日志情况分析与归纳

    发现当备份表格的sql语句与删除该表部分数据的sql语句同时运行时,mysql会检测出死锁,并打印出日志
    2012-12-12
  • MySQL 不用存储过程循环插入数据的方法

    MySQL 不用存储过程循环插入数据的方法

    在MySQL中,使用INSERT INTO VALUES语句可以一次性插入多行数据,提高插入效率,还可通过Python的pymysql库生成和执行插入语句,这不仅减少了操作时间,还提高了代码的简洁性和执行效率
    2024-09-09
  • MYSQL事务的隔离级别与MVCC

    MYSQL事务的隔离级别与MVCC

    这篇文章主要介绍了MYSQL事务的隔离级别与MVCC,文章首先通过事务的相关内容展开主题主要介绍,具有一定的参考价值,需要的小伙伴可以参一下
    2022-05-05
  • 完美解决MySQL通过localhost无法连接数据库的问题

    完美解决MySQL通过localhost无法连接数据库的问题

    下面小编就为大家带来一篇完美解决MySQL通过localhost无法连接数据库的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • 解决Mysql建表时报错invalid ON UPDATE clause for 'create_date' column

    解决Mysql建表时报错invalid ON UPDATE clause for 'create_d

    这篇文章主要介绍了解决Mysql建表时报错invalid ON UPDATE clause for 'create_date' column问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • MySQL 4.0 升级到mysql 5.0的方法

    MySQL 4.0 升级到mysql 5.0的方法

    需要从4.0直接升级到5.0,查看了一下changelog,发现主要有以下变化,需要升级mysql的朋友可以参考下。
    2011-02-02
  • explain分析sql效率的方法

    explain分析sql效率的方法

    下面小编就为大家带来一篇explain分析sql效率的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • MySQL使用IF函数动态执行where条件的方法

    MySQL使用IF函数动态执行where条件的方法

    这篇文章主要介绍了MySQL使用IF函数来动态执行where条件,详细介绍了IF函数在WHERE条件中的使用,MySQL的IF()函数,接受三个表达式,如果第一个表达式为true,而不是零且不为NULL,它将返回第二个表达式,需要的朋友可以参考下
    2022-09-09

最新评论