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

1:MySQL视图

1:什么是视图

视图是一个虚拟表,其内容由一条 SELECT 查询语句定义。它本身不存储数据,所有数据都来自于底层的 "基表"。

核心特性:数据双向联动

  • 修改视图中的可更新数据,会直接影响基表
  • 基表的数据发生变化,视图的查询结果也会实时更新

主要作用

  • 简化复杂的多表查询,将常用查询封装为视图
  • 隐藏基表的敏感字段(如密码、薪资),提升数据安全性
  • 实现数据隔离,不同用户只能看到自己权限内的数据

2:视图基本操作

1:创建员工表
sql 复制代码
-- 创建部门表
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:创建视图并查询
sql 复制代码
-- 创建视图
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:修改视图数据,验证对基表的影响
sql 复制代码
-- 先查看基表中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:修改基表数据,验证对视图的影响
sql 复制代码
-- 修改基表中JAMES的部门编号
UPDATE EMP SET deptno = 10 WHERE ename = 'JAMES';

-- 查询视图中JAMES的部门
SELECT * FROM v_ename_dname WHERE ename = 'JAMES';

基表数据变化会实时反映在视图中,因为视图是动态查询的。

5:删除视图
sql 复制代码
-- 删除视图
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 等)

查看所有用户

sql 复制代码
USE mysql;
SELECT host, user, authentication_string FROM user;

3:用户基本操作

所有实验均使用 root 用户登录 MySQL 执行

1:创建新用户
sql 复制代码
-- 创建只能从本机登录的用户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:删除用户
sql 复制代码
-- 错误写法(默认匹配%主机,会报错)
DROP USER dev; -- ERROR 1396 (HY000): Operation DROP USER failed for 'dev'@'%'

-- 正确写法(必须完整指定'用户名'@'主机')
DROP USER 'dev'@'localhost';

MySQL 用户是'用户名'@'主机'的组合,两者共同唯一标识一个用户。

3:修改用户密码
sql 复制代码
-- 1. 用户自己修改自己的密码
SET PASSWORD = PASSWORD('NewDev@123456');

-- 2. root用户修改指定用户的密码
SET PASSWORD FOR 'dev'@'localhost' = PASSWORD('RootSet@123456');

退出 MySQL,使用新密码登录 dev 用户。

4:权限管理

1:给用户授权
sql 复制代码
-- 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;

登录

sql 复制代码
-- 查看数据库(应该能看到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:回收用户权限
sql 复制代码
-- 回收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
  • 严格遵循最小权限原则,只给用户完成工作所需的最小权限
  • 定期修改密码,使用包含大小写、数字、特殊字符的强密码
  • 及时删除不再使用的用户,避免遗留安全隐患
  • 通过视图实现列级权限控制,不要直接给用户基表的查询权限
相关推荐
KaMeidebaby1 小时前
卡梅德生物技术快报|多肽库筛选技术构建药物递送功能肽库:流程、算法与质控体
前端·数据库·其他·百度·新浪微博
guaiyud52 小时前
MySQL 8.0 小白安装教程(Windows + macOS 双版本)
mysql·安装·小白
wljt2 小时前
Redis的5种数据类型
数据库·redis·缓存
Nirvana在掘金2 小时前
MySQL 事务隔离级别 锁 高并发场景优化经验
后端·mysql
sakiko_2 小时前
Swift学习笔记30-数据库SQlite语句
数据库·学习·swift
IvorySQL2 小时前
用生成列提升 JSONB 查询效率:PostgreSQL 三种索引方案实测对比
数据库·postgresql
STDD2 小时前
Abiotic Factor多人生存建筑游戏《非生物因素》 专用服务器搭建教程
服务器·数据库·游戏
淼淼爱喝水2 小时前
【Ansible 入门实战】三种变量详解
java·linux·数据库·ansible·playbook
云草桑2 小时前
Odoo企业商用到底是不是免费的?
数据库·odoo·erp