03.12 Day 53 - grant 和 flush privileges 语句

大家好,我是 Snow Hide,作为《MySQL 实战》这个专栏的学员之一,这是我打卡的第 53 天,也是我第 115 次进行这种操作。

今天我温习了该专栏里一篇叫《grant之后要跟着flush privileges吗?》的文章。

关键词总结:创建用户命令的两个动作、全局权限(grant 命令的两个动作、grant 命令的分析结果、回收 grant 语句赋予的权限、revoke 命令的两个动作)、db 权限(库级别 grant 命令的两个动作)、表权限和列权限(两类权限的赋予命令、不需要执行 flush privileges 命令的场景)、flush privileges 使用场景(删除用户后内存数据还存在的结果)。

所学总结:

创建用户命令的两个动作

create user 'ua'@'%' identified by 'pa';
  • 在磁盘上,往 mysql.user 表里插入一行,但由于没有指定权限,所以该行数据上所有与权限有关的字段值都为 'N'
  • 在内存里,往数组 acl_users 里插入一个 acl_user 对象,该对象的 access 字段值为 0
     

全局权限

grant all privileges on *.* to 'ua'@'%' with grant option;

grant 命令的两个动作

  1. 在磁盘上,将 mysql.user 表里用户 'ua'@'%' 行的所有与权限相关的字段值都改为 'Y'
  2. 在内存里,从数组 acl_users 中找到该用户对应的对象,将 access 值(权限位)改为二进制的 “全 1”。

grant 命令的分析结果

  1. grant 命令对于全局权限,同时更新了磁盘和内存。命令完成后即时生效,接下来新创建的连接会使用新的权限;
  2. 对于一个已经存在的连接,它的全局权限不受 grant 命令的影响。

回收 grant 语句赋予的权限

revoke all privileges on *.* from 'ua'@'%';

revoke 命令的两个动作

  1. 在磁盘上,将 mysql.user 表里用户 'ua'@'%' 行的所有与权限相关的字段值都改为 'N'
  2. 在内存里,从数组 acl_users 中找到该用户对应的对象,将 access 的值修改为 0
     

db 权限

grant all privileges on db1.* to 'ua'@'%' with grant option;

库级别 grant 命令的两个动作

  1. 在磁盘上,往 mysql.db 表中插入了一行记录,所有权限位字段设置为 'Y'
  2. 在内存里,增肌一个对象到数组 acl_dbs 中,该对象的权限位为 “全 1”。
     

表权限和列权限

两类权限的赋予命令

create table db1.t1(id int, a int);

grant all privileges on db1.t1 to 'ua'@'%' with grant option;
GRANT SELECT(id), INSERT (id,a) ON mydb.mytbl TO 'ua'@'%' with grant option;

不需要执行 flush privileges 命令的场景

  • 内存的权限数据和磁盘数据表相同的情况;
  • 使用 grant/revoke 语句时,因为内存和数据表本来就是保持同步更新的;
  • 正常情况下,grant 命令之后没有必要跟着执行 flush privileges 命令。
     

flush privileges 使用场景

删除用户后内存数据还存在的结果

由于在事务三时直接删除了数据表的记录,而内存的数据还在:

  1. 事务四时给用户 ua 赋权失败,因为 mysql.user 表中找不到该行记录;
  2. 而事务五时要重新创建该用户也不行,因为在做内存判断时,会认为该用户还存在。

末了

重新总结了一下文中提到的内容:MySQL 用户权限在数据表和内存中的存在形式、grant 和 revoke 命令的执行逻辑、规范地使用 grant 和 revoke 语句时不需要后跟 flush privileges 语句、flush privileges 语句本身会用数据表的数据重建一份内存权限数据。

发布了224 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/stevenchen1989/article/details/104810517
今日推荐