ORACLE等大型数据库的权限验证,一般都是XX拥有ZZ的权限,而MySQL数据库的权限验证在设计阶段就体现的有所不同,它在这中间又加了一级纬度,变成:从YY来的那个XX拥有ZZ的权限,如果换一个角度来描述,也可以说是:XX只有从YY连接过来,才能够访问ZZ。这样理解的话,就跟ORACLE这类数据库的身份验证机制相同了,只不过ORACLE这类数据库中,默认是不加YY这一层的(如果想加当然也可以支持),而在MYSQL中,YY成了一个必选项。

  在本文正式开始前先描述这样一段,并不是想说MySQL有多么高级或先进,只是想表达这样一种看法,MySQL确实有所不同。Ok,接下来,跟随三思一起,进入Mysql的权限世界吧~~~~

一、工作原理

  所有权限认证的根本目地,都是为了保证用户只能做允许它做的事情,MySQL也不例外,大家(范指数据库产品)实现的原理也都差不多,只不过机制上稍有差异,在权限粒度控制上有所不同。

  MySQL数据库对权限的验证有两个层面:

  • 能不能连接:主要由mysql.user,mysql.db,mysql.host三个字典表控制(事实上截止到5.1版本,Host表也基本没啥用,主要由user,db两表控制);
  • 能不能执行操作:这个复杂一点点,除了上面三个字典表外,另外还有mysql.tables_priv、mysql.columns_priv、mysql.proc_priv三个字典表做更细粒度的控制。

  由上可以看出,MySQL数据库主要是通过这六个字典表,来实现不同粒度的权限需求,关于这几个视图后面会有章节详细描述,这里简要介绍其处理逻辑。

  MySQL启动时将这几个表中的内容读到内存里,当有用户连接或执行操作时,根据内存中的数据来检查用户是否有权限执行相应的操作。

  注意,如果你读的足够认真并且大脑持续在进行思考,这会儿应该会产生这样的一个疑问:如果用户连接上数据库后,又有其它人对其权限进行了修改操作,是否会即时生效呢?这个问题的答案是:看情况!

  • 如果是通过grant、revoke、set password、rename user等命令执行的修改,那么会马上生效,这些命令将触发系统重新载入授权表(grant tables)。
  • 如果是手动修改字典表方式(insert,update,delete),那么权限并不会马上生效,除非重启服务器,或管理用户显式的重新装载了授权表。

  授权表被重新装载后,对当前已连接的客户端影响如下:

  • 表或列的权限将在客户端下次执行操作时生效;
  • 数据库的权限将在客户端执行use db_name语句时生效;
  • 全局权限和密码修改对已连接的客户端无效,下次连接时才会生效。

  提示:关于权限级别将在后面章节介绍!