Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql视图特性和用户权限管理

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

作者:思麟呀

文章详细介绍了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:为什么需要用户管理

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:安全实践

到此这篇关于MySQL中的视图特性和用户权限管理详解的文章就介绍到这了,更多相关mysql视图特性和用户权限管理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文