MySQL的权限

来源:互联网 发布:人工智能发展的危机 编辑:程序博客网 时间:2024/05/24 05:59

mysql的权限控制非常的多样,精细,从所有数据库的粒度到确定表的确定字段的控制都可以做到。

mysql的权限控制信息记录在mysql数据库下面的user表,db表,tables_priv表和columns_priv表中。因为这些表里面的权限控制数据要非常频繁的使用,所有mysql在启动的时候就会将里面的数据load到内存中,当磁盘上数据表的数据发生改变时,改变可以手动或者自动的flush到内存中。上述四个表按照自己的职责记录着不同的级别的权限。所以先介绍下权限的级别。

在介绍权限级别前,先复习下权限授予和回收的语法:

1.权限的授予和回收

授予: grant [权限名] on [数据库名].[表名] to '用户名'@'用户所处的主机名' identified by '用户密码';  注:如果用户已经存在那么identified by 字段可以去除。

回收:revoke [权限名] on [数据库名].[表名] from '用户名'@'用户所处的主机名';

注意请确保你使用的当前用户有执行grant和revoke的权限。其中的参数存在如下对应的通配,表示“所有”:

权限名  通配符  all  表示所有权限

数据库名 通配符  *  表示所有数据库

表名  通配符 *  表示所有表

用户所处的主机名  通配符 *  表示任何主机

权限的授予和回收均需要用上述的命令进行,更加参数可以知道有如下的组合:

权限适用所有数据库的所有表所有列;

权限适用确定数据库的所有表所有列;

权限适用确定数据库的确定表所有列;

权限适用确定数据的确定表的确定列确定列;

上面就是四种主要级别的权限了。下面一一介绍:

2权限的级别

2.1Global level

   即权限适用所有数据库的所有表所有列。命令例子:

grant select on *.* on 'hfut'@'localhost';

表示为主机名为localhost的用户hfut授予select权限,该权限适用所有数据库的所有表所有列;执行者条记录会发现在mysql数据库的user表中多了一条记录,这说明user表记录的是全局控制权限;

2.2Database Level

   即权限适用确定数据库的所有表所有列。命令例子:

grant select on test.* on 'hfut'@'localhost';

表示为主机名为localhost的用户hfut授予select权限,该权限适用test数据库的所有表所有列;执行这条记录会发现在mysql数据库的db表中多了一条记录,这说明db表记录的是数据级别的权限控制信息;

2.3Table Level

   即权限适用确定数据库的确定表所有列。命令例子:

grant select on test.test on 'hfut'@'localhost';

表示为主机名为localhost的用户hfut授予select权限,该权限适用test数据库的test表;执行这条记录会发现在mysql数据库的tables_priv表中多了一条记录,这说明tables_priv表记录的是表级别的权限控制信息;

2.4Column Level

   即权限适用确定数据的确定表的确定列确定列。命令例子:

grant select (id,name) on test.test on 'hfut'@'localhost';

表示为主机名为localhost的用户hfut授予select权限,该权限适用test数据库的test表的id和name两列;执行这条记录会发现在mysql数据库的tables_priv表和columns_priv表中均增加了一条记录,这说明tables_priv表和columns_priv表共同完成了列级别的权限;

2.5Rountine Level

  这个就不是上面的组合出来的了,这种权限是针对mysql的存储过程的,是存储的执行权限,是更为严格的权限;

好了,说明完成,这里提醒一句:如果同时设置了大级别的权限和小级别的权限,那么小级别的权限的设置是没用的;因为mysql判定权限的过程是先匹配user表,然后匹配db表,然后匹配tables_priv表,最后匹配columns_priv表,这个匹配过程中,只要有一个匹配成功那么停止匹配。

原创粉丝点击