MySQL-视图与用户管理

目录

一、视图

[1. 基本使用](#1. 基本使用)

[2. 视图规则和限制](#2. 视图规则和限制)

二、用户管理

[1. 用户相关操作](#1. 用户相关操作)

[2. 数据库的权限管理](#2. 数据库的权限管理)


在 MySQL 的世界里,视图和用户管理是两个非常关键的知识点。视图能让我们更灵活地查询数据,用户管理则保障了数据库的安全访问。今天,咱们就来好好聊聊这两块内容。

一、视图

视图是一个虚拟表,它的内容由查询定义。就像真实的表一样,视图包含列和行数据,而且视图和基表之间数据是相互影响的,视图的数据变化会影响基表,基表的数据变化也会影响视图。

1. 基本使用

  • 创建视图:用 create view 视图名 as select语句; 就能创建视图。比如要创建一个关联员工表(EMP)和部门表(DEPT),展示员工姓名(ename)和部门名称(dname)的视图 v_ename_dname ,可以这样写:
sql 复制代码
create view v_ename_dname as select ename, dname from EMP, DEPT where EMP.deptno=DEPT.deptno;

然后查询这个视图 select * from v_ename_dname; ,就能看到相关数据啦。

  • 视图与基表的相互影响:

- 修改视图会影响基表,比如执行 update v_ename_dname set dname='sales' where ename='CLARK'; ,再查询基表中 CLARK 的数据,会发现已经改变。

- 修改基表也会影响视图,像 update EMP set deptno=20 where ename='JAMES'; ,之后查询视图里 JAMES 的数据,也会有变化。

  • 删除视图:用 drop view 视图名; 就可以删除视图啦。

2. 视图规则和限制

  • 视图得唯一命名,不能和已有的视图或表重名。

  • 创建视图的数量没限制,但复杂查询创建视图后要考虑性能影响。

  • 视图不能加索引,也不能有关联的触发器或默认值。

  • 视图能提高安全性,不过得有足够的访问权限。

  • order by 可以用在视图里,但如果从视图检索数据的 select 语句也有 order by ,视图里的 order by 会被覆盖。

  • 视图还能和表一起使用。

  1. 实战:创建演员视图

比如针对 actor 表创建视图 actor_name_view ,可以这样写:

sql 复制代码
create view actor_name_view as select * from actor;

二、用户管理

要是只使用 root 用户,会存在安全隐患,这时候就需要进行 MySQL 的用户管理啦。不同用户可以被赋予不同数据库的操作权限,像张三只能操纵 mytest 库,李四只能操纵 msg 库,这样能大大降低风险。

1. 用户相关操作

MySQL 中的用户,都存储在系统数据库 mysql 的 user 表中。

  • 查看用户信息:可以先 use mysql; 切换到 mysql 数据库,然后执行 **select host,user,authentication_string from user;**来查看用户信息,也能通过 desc user 初步查看表结构。其中 host 表示用户可登录的主机, localhost 就表示只能从本机登录; user 是用户名; authentication_string 是用户密码通过 password 函数加密后的值; *_priv 是用户拥有的权限。

  • 创建用户:语法是 create user '用户名'@'登陆主机/ip' identified by '密码';。比如创建用户 whb ,只能从本机登录,密码是 12345678 ,就可以写 create user 'whb'@'localhost' identified by '12345678'; 。不过要注意,MySQL 本身认证等级较高,简单密码可能设置不了,遇到 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements 这样的报错,可以去查看密码设置相关要求( SHOW VARIABLES LIKE 'validate_password%'; ),再进行调整。而且不要轻易添加能从任意地方登录的用户。

  • 删除用户:语法是 drop user '用户名'@'主机名'。比如删除用户 whb @ localhost ,就执行 drop user 'whb'@'localhost'; 。要注意直接给用户名,不指定主机名是删不掉的,因为默认是 % ,表示所有地方都能登录的用户。

  • 修改用户密码:自己改自己密码用 set password=password('新的密码');; root 用户修改指定用户的密码用 set password for '用户名'@'主机名'=password('新的密码');。比如 root 用户修改 whb @ localhost 的密码为 87654321 ,就执行 set password for 'whb'@'localhost'=password('87654321'); 。

2. 数据库的权限管理

MySQL 数据库提供了丰富的权限,像 CREATE (用于数据库、表或索引)、 DROP (用于数据库或表)、 SELECT (用于表)等等。

  • 给用户授权:刚创建的用户没有任何权限,需要给用户授权。语法是 grant 权限列表 on 库.对象名 to '用户名'@'登陆位置' [identified by '密码']。权限列表里多个权限用逗号分开, *.* 代表本系统中所有数据库的所有对象(表、视图、存储过程等), 库.* 表示某个数据库中的所有数据对象。 identified by 是可选的,如果用户存在,赋予权限的同时会修改密码;如果用户不存在,就会创建用户。比如给用户 whb 赋予 test 数据库下所有文件的 select 权限,就执行 grant select on test.* to 'whb'@'localhost'; 。授权后如果没生效,可以执行 flush privileges; 刷新权限。

  • 回收权限:语法是 revoke 权限列表 on 库.对象名 from '用户名'@'登陆位置';。比如回收 whb 对 test 数据库的所有权限,就执行 revoke all on test.* from 'whb'@'localhost';

掌握了视图和用户管理,咱们在 MySQL 中操作数据就更得心应手啦,既能灵活查询,又能保障安全~

相关推荐
自不量力的A同学25 分钟前
Redisson 4.2.0 发布,官方推荐的 Redis 客户端
数据库·redis·缓存
Exquisite.27 分钟前
Mysql
数据库·mysql
全栈前端老曹1 小时前
【MongoDB】深入研究副本集与高可用性——Replica Set 架构、故障转移、读写分离
前端·javascript·数据库·mongodb·架构·nosql·副本集
R1nG8631 小时前
CANN资源泄漏检测工具源码深度解读 实战设备内存泄漏排查
数据库·算法·cann
阿钱真强道1 小时前
12 JetLinks MQTT直连设备事件上报实战(继电器场景)
linux·服务器·网络·数据库·网络协议
逍遥德2 小时前
Sring事务详解之02.如何使用编程式事务?
java·服务器·数据库·后端·sql·spring
笨蛋不要掉眼泪2 小时前
Redis哨兵机制全解析:原理、配置与实战故障转移演示
java·数据库·redis·缓存·bootstrap
Coder_Boy_2 小时前
基于SpringAI的在线考试系统-整体架构优化设计方案
java·数据库·人工智能·spring boot·架构·ddd
fen_fen10 小时前
Oracle建表语句示例
数据库·oracle
砚边数影12 小时前
数据可视化入门:Matplotlib 基础语法与折线图绘制
数据库·信息可视化·matplotlib·数据可视化·kingbase·数据库平替用金仓·金仓数据库