MySQL 中的权限分为五个级别,分别如下:
1、Global Level:
总结:
1 全局权限控制是针对整个mysql的,对所有数据库下的所有表及字段都有效
2 使用*.*指定适合范围的Global
Global Level 的权限控制又称为全局权限控制,所有权限信息都保存在mysql.user 表
中。Global Level 的所有权限都是针对整个mysqld 的,对所有的数据库下的所有表及所有
字段都有效。如果一个权限是以Global Level 来授予的,则会覆盖其他所有级别的相同权
限设置。比如我们首先给abc 用户授权可以UPDATE 指定数据库如test 的t 表,然后又在
全局级别REVOKE 掉了abc 用户对所有数据库的所有表的UPDATE 权限。则这时候的abc 用户将不再拥有用对test.t 表的更新权限。
要授予Global Level 的权限,则只需要在执行GRANT 命令的时候,用“*.*”来指定适
用范围是Global 的即可,当有多个权限需要授予的时候,也并不需要多次重复执行GRANT
命令,只需要一次将所有需要的权限名称通过逗号(“,”)分隔开即可,如下:
root@localhost : mysql 05:14:35> GRANT SELECT,UPDATE,DELETE,INSERT ON *.*
TO 'mes'@'10.86.87.180';
Query OK, 0 rows affected (0.00 sec)
2、Database Level
总结:
1 Database Level在Global Level下
Database Level 是在Global Level 之下,其他三个Level 之上的权限级别,其作用域
即为所指定整个数据库中的所有对象。与Global Level 的权限相比,Database Level 主要
少了以下几个权限:CREATE USER,FILE,PROCESS,RELOAD,REPLICATION CLIENT,REPLICATION
SLAVE,SHOW DATABASES,SHUTDOWN,SUPER 和USAGE 这几个权限,没有增加任何权限。之前我们说过Global Level 的权限会覆盖底下其他四层的相同权限,Database Level 也一样,
虽然他自己可能会被Global Level 的权限设置所覆盖,但同时他也能覆盖比他更下层的
Table,Column 和Routine 这三层的权限。
如果要授予Database Level 的权限,则可以有两种实现方式:
1、在执行GRANT 命令的时候,通过“database.*”来限定权限作用域为database 整个
数据库,如下:
第一步,分配权限,查看权限
grant alter on dms.* to 'mes'@'10.86.87.180';
mysql> show grants for 'mes'@'10.86.87.180';
第二步,访问dms数据库的表
注:经过此操作后(grant alter on dms.* to 'mes'@'10.86.87.18),用户mes能够访问数据库dms中的所有表。
2、先通过USE 命令选定需要授权的数据库,然后通过“*”来限定作用域,这样授权的
作用域实际上就是当前选定的整个数据库。
root@localhost : mysql 06:14:05> USE dms;
Database changed
root@localhost : test 06:13:10> GRANT DROP ON * TO 'mes'@'10.86.87.180';
Query OK, 0 rows affected (0.00 sec)
3、Table Level
总结:
1 Table Level是在Database Level之下
2 通过grant select on dms.ATTACHMENTS to 'mes'@'10.86.87.180' ;方式进行分配权限
Database Level 之下就是Table Level 的权限了,Table Level 的权限可以被Global
Level 和Database Level 的权限所覆盖,同时也能覆盖Column Level 和Routine Level 的
权限。Table Level 的权限作用范围是授权语句中所指定数据库的指定表。如可以通过如下语
句给test 数据库的t1 表授权:
第一步,分权访问表的权限、查看权限
grant select on dms.ATTACHMENTS to 'mes'@'10.86.87.180' ;
show grants for 'mes'@'10.86.87.180' ;
第二步,测试访问表权限
注:由此可知,发现进行授权后(grant select on dms.ATTACHMENTS to 'mes'@'10.86.87.180' ;
),mes就有访问表ATTACHMENTS的权限。
Table Level 的权限由于其作用域仅限于某个特定的表,所以权限种类也比较少,仅有
ALTER,CREATE,DELETE,DROP,INDEX,INSERT,SELECT UPDATE 这八种权限
4、Column Level
总结:
1 Column Level在Table Level之下
2 Column Level权限仅有INSERT、SELECT、UPDATE三种
3
Column Level 的权限作用范围就更小了,仅仅是某个表的指定的某个(活某些)列。
由于权限的覆盖原则,Column Level 的权限同样可以被Global,Database,Table 这三个
级别的权限中的相同级别所覆盖,而且由于Column Level 所针对的权限和Routine Level
的权限作用域没有重合部分,所以不会有覆盖与被覆盖的关系。针对Column Level 级别的
权限仅有INSERT,SELECT 和UPDATE 这三种。Column Level 的权限授权语句语法基本和Table Level 差不多,只是需要在权限名称后面将需要授权的列名列表通过括号括起来,如下:
第一步,分配权限、查看权限
mysql> grant select(BANDANAID,BANDANACONTEXT) on dms.BANDANA to 'mes'@'10.86.87.180';
mysql> show grants for 'mes'@'10.86.87.180';
第二步,验证用户mes是否具有访问表BANDANA列的权限
注:经测试,发现用户只有访问表BANDANA分配的两个列的权限,并没有访问其他列的权限。
5、Routine Level(常规)
总结:
1 Routine Level主要只有EXECUTE 和ALTER ROUTINE两种权限
2 Routine Level 主要针对函数和存储过程两个对象
Routine Level 的权限主要只有EXECUTE 和ALTER ROUTINE 两种,主要针对的对象是
procedure 和function 这两种对象,在授予Routine Level 权限的时候,需要指定数据库
和相关对象,如:
root@localhost : test 04:03:26> GRANT EXECUTE ON test.p1 to
'mes'@'10.86.87.180';
Query OK, 0 rows affected (0.00 sec)
除 了上面几类权限之外,还有一个非常特殊的权限GRANT,拥有GRANT 权限的用户可以将自身所拥有的任何权限全部授予其他任何用户,所以GRANT 权限是一个非常特殊也非常重要的权限。GRANT 权限的授予方式也和其他任何权限都不太一样,通常都是通过在执行GRANT授权语句的时候在最后添加WITH GRANT OPTION 子句达到授予GRANT 权限的目的。