grant之后要跟着flush privileges吗?

grant 语句会同时修改数据表和内存,判断权限使用的是内存数据。规范地使用grant和revoke语句,不需要随后加上flush privileges语句的。

flush privileges 其实就是清空了内存中的权限,然后重新从权限表加载数据。因此如果用DML语句改了系统权限表,就需要用flush privileges重建内存的权限。

全局权限

全局权限,作用于整个 MySQL 实例,这些权限信息保存在 mysql 库的 user 表里。如果我要给用户 ua 赋一个最高权限的话,语句是这么写的

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

这个 grant 命令做了两个动作:、

  1. 磁盘上,将 mysql.user 表里,用户’ua’@’%’这一行的所有表示权限的字段的值都修改为‘Y’;
  2. 内存里,从数组 acl_users 中找到这个用户对应的对象,将 access 值(权限位)修改为二进制的“全 1”。

重点来了,对于一个已经存在的连接,它的全局权限不受grant命令的影响,原因是每个连接已经将权限拷贝到本线程内存中了。grant对于全局权限,只对接下来新创建的连接有用。

db 权限

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

参照全局权限,修改了mysql.db表,权限位字段设置为Y,内存里修改了acl_dbs. 权限位设置为全1

跟全局权限不同,grant 库权限,会对已存在的连接生效,除非在开始的时候用use db 语句将这个库的权限保存到session中,在切换出db库前,会一直有权限。

表权限和列权限

表权限存放在mysql.table_priv, 列权限存放在mysql.columns_priv, 内存中表,列权限组合起来构成内存的hash结构 column_priv_hash。

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;

对这两类权限的修改,也会马上影响已存在的连接。

revoke 回收权限

revoke all privileges on db1.* from 'ua'@%;
回收ua用户对db1数据库的权限

原文地址:http://www.cnblogs.com/linyihai/p/16885229.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性