1) 权限的授予与回收
方法一:MySQL 的权限系统相关权限信息主要存储在几个被称为grant tables 的系统表中,即: mysql.User,mysql.db,mysql.Host,mysql.table_priv 和mysql.column_priv。手工修改了权限相关的表之后,都需要执行“FLUSH PRIVILEGES”命令重新加载MySQL的权限信息;
方法二:通过GRANT,REVOKE 或者DROP USER 命令来修改相关权限,则不需要手工执行FLUSH PRIVILEGES 命令;因为通过GRANT,REVOKE 或者DROP USER 命令所做的权限修改在修改系统表的同时也会更新内存结构中的权限信息。在MySQL5.0.2 或更高版本的时候,MySQL 还增加了CREATE USER 命令,以此创建无任何特别权限(仅拥有初始USAGE权限)的用户,通过CREATE USER 命令创建新了新用户之后,新用户的信息也会自动更新到内存结构中。所以,建议读者一般情况下尽量使用GRANT,REVOKE,CREATE USER 以及DROP USER 命令来进行用户和权限的变更操作,尽量减少直接修改grant tables 来实现用户和权限变更的操作。
2) 查看授予的权限
查看某个用户目前拥有的权限,这可以通过两个方式实现:
首先是通过执行“SHOW GRANTS FOR 'username'@'hostname'” 命令来获取之前该用户身上的所有授权。
另一种方法是查询grant tables 里面的权限信息。
3) 权限级别
MySQL 中的权限分为五个级别,分别如下:
权限 |
Global |
Database |
Table |
Column |
Routine |
INSERT |
Y |
Y |
Y |
Y |
|
SELECT |
Y |
Y |
Y |
Y |
|
UPDATE |
Y |
Y |
Y |
Y |
|
ALTER |
Y |
Y |
Y |
||
CREATE |
Y |
Y |
Y |
||
DELETE |
Y |
Y |
Y |
||
DROP |
Y |
Y |
Y |
||
INDEX |
Y |
Y |
Y |
||
ALTER ROUTINE |
Y |
Y |
Y |
||
EXECUTE |
Y |
Y |
Y |
||
ALL [PRIVILEGES] |
Y |
Y |
|||
CREATE ROUTINE |
Y |
Y |
|||
CREATE TABLESPACE |
Y |
Y |
|||
CREATE TEMPORARY TABLES |
Y |
Y |
|||
CREATE VIEW |
Y |
Y |
|||
EVENT |
Y |
Y |
|||
GRANT OPTION |
Y |
Y |
|||
LOCK TABLES |
Y |
Y |
|||
PROXY |
Y |
Y |
|||
REFERENCES |
Y |
Y |
|||
SHOW DATABASES |
Y |
Y |
|||
SHOW VIEW |
Y |
Y |
|||
TRIGGER |
Y |
Y |
|||
CREATE USER |
Y |
||||
FILE |
Y |
||||
PROCESS |
Y |
||||
RELOAD |
Y |
||||
REPLICATION CLIENT |
Y |
||||
REPLICATION SLAVE |
Y |
||||
SHUTDOWN |
Y |
||||
SUPER |
Y |
||||
USAGE |
Y |
(1)Global Level
要授予Global Level 的权限,则只需要在执行GRANT 命令的时候,用“*.*”来指定适用范围是Global 的即可,当有多个权限需要授予的时候,也并不需要多次重复执行GRANT命令,只需要一次将所有需要的权限名称通过逗号(“,”)分隔开即可,如下:
mysql> GRANT SELECT,UPDATE,DELETE,INSERT ON *.* TO 'def'@'localhost';
(2)Database Level
如果要授予Database Level 的权限,则可以有两种实现方式:
1、在执行GRANT 命令的时候,通过“database.*”来限定权限作用域为database 整个数据库,如下:
root@localhost : mysql 06:06:26> GRANT ALTER ON test.* TO 'def'@'localhost';
2、先通过USE 命令选定需要授权的数据库,然后通过“*”来限定作用域,这样授权的作用域实际上就是当前选定的整个数据库。
root@localhost : mysql 06:14:05> USE test;
root@localhost : test 06:13:10> GRANT DROP ON * TO 'def'@'localhost';
在授予权限的时候,如果有相同的权限需要授予多个用户,我们也可以在授权语句中一次写上多个用户信息,通过逗号(,)分隔开就可以了,如下:
root@localhost : mysql 05:22:32> grant create on perf.* to'abc'@'localhost','def'@'localhost';
(3)Table Level
Table Level 的权限作用范围是授权语句中所指定数据库的指定表。如可以通过如下语句给test 数据库的t1 表授权:
root@localhost : test 12:02:15> GRANT INDEX ON test.t1 TO
上面的授权语句在测试给test 数据库的t1 表授予Table Level 的权限的同时,还测试了将权限授予含有通配符“%”的所有“.jianzhaoyang.com”主机。其中的USAGE 权限是每个用户都有的最基本权限。
(4)Column Level
Column Level 的权限授权语句语法基本和Table Level 差不多,只是需要在权限名称后面将需要授权的列名列表通过括号括起来,如下:
root@localhost : test 12:14:46> GRANT SELECT(id,value) ON test.t2 TO
注意:当某个用户在向某个表插入(INSERT)数据的时候,如果该用户在该表中某列上面没有INSERT 权限,则该列的数据将以默认值填充。这一点和很多其他的数据库都有一些区别,是MySQL 自己在SQL 上面所做的扩展。
(5)Routine Level
Routine Level 的权限主要只有EXECUTE 和ALTER ROUTINE 两种,主要针对的对象是procedure 和function 这两种对象,在授予Routine Level 权限的时候,需要指定数据库和相关对象,如:
root@localhost : test 04:03:26> GRANT EXECUTE ON test.p1 to
除了上面几类权限之外,还有一个非常特殊的权限GRANT,拥有GRANT 权限的用户可以将自身所拥有的任何权限全部授予其他任何用户,所以GRANT 权限是一个非常特殊也非常重要的权限。GRANT 权限的授予方式也和其他任何权限都不太一样,通常都是通过在执行GRANT 授权语句的时候在最后添加WITH GRANT OPTION 子句达到授予GRANT 权限的目的。此外,我们还可以通过GRANT ALL 语句授予某个Level 的所有可用权限给某个用户,如:
root@localhost : test 04:15:48> grant all on test.t5 to 'abc';
root@localhost : test 04:27:39> grant all on perf.* to 'abc';
在以上五个Level 的权限中,Table、Column 和Routine 三者在授权中所依赖(或者引用)的对象必须是已经存在的,而不像Database Level 的权限授予,可以在当前不存在该数据库的时候就完成授权。
【参考】
【1】MySQL性能调优与架构设计 PDF中文版全册.pdf,http://www.linuxidc.com/
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。