Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1208530
  • 博文数量: 350
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 5668
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-23 17:53
文章分类

全部博文(350)

文章存档

2013年(350)

分类: Mysql/postgreSQL

2013-04-11 15:31:11

ORACLE等大型数据库的权限验证,一般都是XX拥有ZZ的权限,而数据库的权限验证在设计阶段就体现的有所不同,它在这中间又加了一级纬度,变成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_privmysql.columns_privmysql.proc_priv三个字典表做更细粒度的控制。

 

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

 

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

 

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

如果是通过grantrevokeset passwordrename user等命令执行的修改,那么会马上生效,这些命令将触发系统重新载入授权表(grant tables)

如果是手动修改字典表方式(insert,update,delete),那么权限并不会马上生效,除非重启服务器,或管理用户显式的重新装载了授权表。

 

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

表或列的权限将在客户端下次执行操作时生效;

数据库的权限将在客户端执行use db_name语句时生效;

全局权限和密码修改对已连接的客户端无效,下次连接时才会生效。

 

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

阅读(1395) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~