【MySQL】用户管理


一、MySQL视图特性

视图 是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。

这里我们需要注意的是,视图中的数据并不会单独存储在数据库中,其数据来自定义视图时查询所引用的表(基表),在每次引用视图时动态生成。

视图的基本使用

准备测试表

下面用 员工表部门表 作为测试表,员工表中的 ename 代表的是员工的姓名,deptno 代表的是员工所在部门的部门号。如下:

在这里插入图片描述

部门表中的dname代表的是部门名、deptno代表的是部门的部门号。如下:

在这里插入图片描述

创建视图

创建视图的SQL语句如下:

CREATE VIEW view_name AS SELECT ...;

这里我们需要注意的是,创建视图时会先执行 select 语句,然后用查询得到的结果来创建视图。

例如:当我们查询每个员工对应的部门名称时,需要使用员工表和部门表进行多表查询,并筛选出员工的部门号等于部门的部门号的记录。如下:

在这里插入图片描述

如果该结果经常需要被用到,那么我们就可以给上述查询结果创建视图, 创建完毕后通过show命令就可以看到这个视图。如下:

在这里插入图片描述

在数据库对应的目录下,会增加一个对应的 xxx.frm 文件,但并没有与之对应的 xxx.ibd 文件,这也证明了视图和基表使用的是同一份数据。如下:

在这里插入图片描述

创建视图后就可以直接通过查询视图,来查看每个员工及其对应的部门名称了。

在这里插入图片描述

修改视图会影响基表

通过查询员工表,可以看到员工CLARK所在部门的部门号为10。如下:

在这里插入图片描述

进一步查询部门表,可以看到10号部门的部门名称为ACCOUNTING。

在这里插入图片描述

在视图中将员工CLARK所在部门的部门名改为HR后,会看到其他一些员工所在部门的部门名也变为HR了。

在这里插入图片描述

根本原因就是因为视图和基表使用的是同一份数据,将视图中CLARK所在部门的部门名改为HR后,部门表中10号部门的部门名也就变成HR了。如下:

在这里插入图片描述

修改基表影响视图

通过查询员工表,可以看到员工JAMES所在部门的部门号为30。

在这里插入图片描述

30号部门的部门名为SALES,因此查询视图时可以看到JAMES所在的部门名为SALES。

在这里插入图片描述

现在将员工表中,员工JAMES对应的部门号改为20。

在这里插入图片描述

修改后再查询视图,就会发现JAMES所在部门的部门名,变成了20号部门的部门名RESEARCH。

在这里插入图片描述

删除视图

删除视图的SQL如下:

DROP VIEW view_name;

在这里插入图片描述

且该视图在数据库目录下对应的xxx.frm文件也会被删除

在这里插入图片描述


视图规则和限制

  • 与普通表一样,视图的命名也必须是唯一的,不能出现同名视图或表名。
  • 创建视图的数目无限制,但要考虑复杂查询创建为视图之后的性能影响。
  • 视图不能添加索引,也不能有关联的触发器或者默认值。
  • 视图可以提高安全性,在访问视图时必须具有足够的访问权限。
  • 创建视图时可以使用order by子句,但如果从该视图检索数据时也含有order by子句,那么该视图中的order by将被覆盖。
  • 视图可以和普通表一起使用,比如进行多表查询,内外连接等。

二、MySQL用户管理

用户

如果我们只能使用 root 用户,这样存在安全隐患。因为 root 用户的权限实在是太高了,一不小心就有可能会从删库到跑路。这时,就需要使用 MySQL 的 用户管理

在这里插入图片描述

如果一个用户只需要访问MySQL中的某一个数据库,甚至数据库中的某一个表,那么可以为其创建一个普通用户,并为该用户赋予对应的权限,而不让该用户看到数据库中的其他数据,防止该用户对其他数据进行误操作。


用户信息

MySQL当中默认有一个名为 mysql 的数据库。

在这里插入图片描述

查看该数据库中的表,可以看到其中有一个名为user的表。

在这里插入图片描述

user表中存储的就是MySQL中用户相关的信息。如下:

在这里插入图片描述

部分字段说明:

  • user: 表示该用户的用户名。
  • host: 表示该用户可以从哪个主机登录,localhost表示只能从本机登录,%表示可以从任意地方登录。
  • authentication_string: 表示该用户的密码经过password函数加密后的值。
  • xxx_priv: 表示该用户是否拥有对应权限。

在查看用户信息时为了避免刷屏,可以只选择其中的部分字段进行显示。如下:

在这里插入图片描述

需要注意的是,MySQL中可以存在同名的用户,只要这些同名用户对应的登录主机不同即可,因为user表中的主键是复合主键,由表中的user列和host列共同承担。如下:

在这里插入图片描述


创建用户

创建用户的SQL如下:

CREATE USER '用户名'@'登录主机' IDENTIFIED BY '密码';

比如下面创建一个用户名为cjl,并且可以从任意地方登录的用户。

在这里插入图片描述

创建用户成功后,该用户的相关信息也就被写入到刚才的user表中了。如下:

在这里插入图片描述

这时便可以用新创建的普通用户来连接MySQL服务器了。如下:

在这里插入图片描述

由于我们创建的这个用户可以从任意地方登录,因此如果你在Windows下也安装了MySQL,那么就可以在Windows的cmd窗口进行远程登录。

在这里插入图片描述

说明一下:

  • 创建用户的SQL当中包含用户的密码,因此该SQL不会被历史记录下来,所以不能通过上下键进行追溯。
  • MySQL本身的认证级别比较高,因此创建用户时设置的密码不能太简单,否则会出现报错,这时你可以选择将密码设置复杂一些,也可以对密码相关的设置进行调整。

通过show命令查看全局变量,可以看到密码设置相关的要求。如下:

在这里插入图片描述


修改用户密码

用户自己修改自己的密码

用户可以自己通过调用password函数,将新密码加密后的值设置到自己password当中。

在这里插入图片描述

超级用户修改任意用户的密码

超级用户可以通过调用password函数,将新密码加密后的值设置到指定用户的password当中。

在这里插入图片描述
当我们修改密码后,可以使用 flush privileges 刷新一下。


删除用户

删除用户的SQL如下:

DROP USER '用户名'@'登录地址';

比如将刚才创建的用户删除后,该用户在user表中对应的记录也就不存在了。如下:

在这里插入图片描述

说明一下:

  • 删除用户时如果不指明待用户的登录地址,则默认删除的是登录地址为%的用户。

数据库的权限

MySQL中的权限

在这里插入图片描述

需要注意的是,新创建的用户没有任何权限,因此创建用户后需要给用户授权。


给用户授权

给用户授权的SQL如下:

GRANT 权限列表 ON 库名.对象名 TO '用户名'@'登录地址' [IDENTIFIED BY '密码'];
  • '用户名'@'登录地址':表示给哪一个用户授权。
  • 库名.对象名:表示要授予用户哪个数据库下的哪个对象的权限。
  • 权限列表:表示要授予用户何种权限,多个权限之间用逗号隔开。
  • IDENTIFIED BY '密码' 可选:如果用户存在,则在授予权限的同时修改该用户的密码,如果用户不存在,则创建该用户。

比如下面创建用户cjl,并授予用户在scott数据库下所有对象的select权限。

在这里插入图片描述

授权后通过show grants for ‘用户名’@'登录地址’命令,可以查看该用户现有的权限。如下:

在这里插入图片描述

说明一下:

  • 创建用户后该用户默认会有USAGE权限,该权限只能用于数据库登录,不能执行任何操作。
  • *.* 表示所有数据库的所有对象,库名.* 表示某个数据库的所有对象(表、视图、存储过程等)。

此时该用户查看数据库时,就能查看到scott数据库了。如下:

在这里插入图片描述

创建用户后该用户默认只能看到information_schema数据库,该数据库中保存的是MySQL服务器所维护的所有其他数据库的信息。
进入scott数据库后,也能查看其中的所有表。
如下:

在这里插入图片描述

但该用户目前只能查看表中的信息,而不能对表中的数据进行修改,因为我们只授予了该用户select权限。

下面将scott数据库下的所有权限都授予该用户。

在这里插入图片描述

这时该用户才可以对表中的数据进行其他操作。

在这里插入图片描述


回收权限

回收权限的SQL如下:

REVOKE 权限列表 ON 库名.对象名 FROM '用户名'@'登录地址';

回收权限的语法与授权一样,只不过将to关键字改为了from,并且没有了IDENTIFIED BY '密码' 字段。

比如下面将cjl用户在scott数据库下的所有权限回收。

在这里插入图片描述

说明一下:

  • 回收用户在某一数据库下的权限后,在该用户下一次进入该数据库时才会起作用。
  • 如果回收权限时该用户正在使用对应数据库,那么回收权限后该用户仍然拥有对应的权限。

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-09 14:46:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-09 14:46:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-09 14:46:03       82 阅读
  4. Python语言-面向对象

    2024-01-09 14:46:03       91 阅读

热门阅读

  1. 第五讲_css元素显示模式

    2024-01-09 14:46:03       60 阅读
  2. 2024.1.5力扣每日一题——队列中可以看到的人数

    2024-01-09 14:46:03       58 阅读
  3. 基于51单片机的智能水表电路设计

    2024-01-09 14:46:03       53 阅读
  4. Android 8.1 默认赋予应用权限

    2024-01-09 14:46:03       62 阅读
  5. Android将自定义View保存为Bitmap图片

    2024-01-09 14:46:03       50 阅读