MySql用户管理使用CREATE USER,DROP USER,RENAME USER,SET PASSWORD等语法来完成,而MySql中用户权限配置管理中大部分都可以使用GRANT(赋予权限)和REVOKE(撤销权限)这两个语法来操作。其中,需要注意的是GRANT语句来赋予权限时,当被赋予权限的用户在系统中不存在时,会创建该用户,而后对该用户进行权限赋予。而REVOKE语句用来权限回收(撤销权限)时,即使被操作的用户所有的权限都被回收,但该用户并不会删除,要删除用户,请使用DROP USER或者直接到mysql.user中删除该用户。
GRANT语法:
GRANT
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
TO user_specification [, user_specification] ...
[REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}]
[WITH with_option ...]
object_type:
TABLE
| FUNCTION
| PROCEDURE
priv_level:
*
| *.*
| db_name.*
| db_name.tbl_name
| tbl_name
| db_name.routine_name
user_specification:
user [IDENTIFIED BY [PASSWORD] 'password']
ssl_option:
SSL
| X509
| CIPHER 'cipher'
| ISSUER 'issuer'
| SUBJECT 'subject'
with_option:
GRANT OPTION
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
看起来有点复杂,对吧,这是标准的帮助文档,我们简而言之,一般语法格式是这样的:
-- GRANT基本的权限赋予语法
GRANT 权限类型1 [(要赋予的对象,列列表)][, 权限类型2[(要赋予的对象,列列表)]]... ON [对象类型] 权限级别 TO 用户1 IDENTIFIED BY '密码' [, 用户2 IDENTIFIED BY '密码' ]...
-- 中括号内的可以忽略。
这样是不是清楚很多,其中GRANT能够赋予的权限类型有以下这些(Tips:注意ALL PRIVILEGES):
权限 |
意义 |
ALL [PRIVILEGES] |
设置除GRANT OPTION之外的所有简单权限 |
ALTER |
允许使用ALTER TABLE |
ALTER ROUTINE |
更改或取消已存储的子程序 |
CREATE |
允许使用CREATE TABLE |
CREATE ROUTINE |
创建已存储的子程序 |
CREATE TEMPORARY TABLES |
允许使用CREATE TEMPORARY TABLE |
CREATE USER |
允许使用CREATE USER, DROP USER, RENAME USER和REVOKE ALL PRIVILEGES。 |
CREATE VIEW |
允许使用CREATE VIEW |
DELETE |
允许使用DELETE |
DROP |
允许使用DROP TABLE |
EXECUTE |
允许用户运行已存储的子程序 |
FILE |
允许使用SELECT...INTO OUTFILE和LOAD DATA INFILE |
INDEX |
允许使用CREATE INDEX和DROP INDEX |
INSERT |
允许使用INSERT |
LOCK TABLES |
允许对您拥有SELECT权限的表使用LOCK TABLES |
PROCESS |
允许使用SHOW FULL PROCESSLIST |
REFERENCES |
未被实施 |
RELOAD |
允许使用FLUSH |
REPLICATION CLIENT |
允许用户询问从属服务器或主服务器的地址 |
REPLICATION SLAVE |
用于复制型从属服务器(从主服务器中读取二进制日志事件) |
SELECT |
允许使用SELECT |
SHOW DATABASES |
SHOW DATABASES显示所有数据库 |
SHOW VIEW |
允许使用SHOW CREATE VIEW |
SHUTDOWN |
允许使用mysqladmin shutdown |
SUPER |
允许使用CHANGE MASTER, KILL, PURGE MASTER LOGS和SET GLOBAL语句,mysqladmin debug命令;允许您连接(一次),即使已达到max_connections。 |
UPDATE |
允许使用UPDATE |
USAGE |
“无权限”的同义词 |
GRANT OPTION |
允许授予权限 |
来栗子才能吃饱,没例子,没真相,下面我们使用几个简单的GRANT语句来为特定用户赋予权限:
/*
===================================================
; blog.useasp.net
; Mitchell Chu
; MySql用户权限配置管理
; GRANT 语法示例
; 下面语法并不是一起的,每个示例为单独说明某一问题而存在
===================================================
*/
-- 1.赋予someuser@somehost这个用户全局所有权限
-- 如果用户不存在,创建该用户,但该用户没有密码
-- 所以这样使用需要特别慎重
GRANT ALL ON *.* TO 'someuser'@'somehost';
-- 2.赋予someuser@somehost这个用户在myDatabase上所有权限
-- 如果用户不存在,创建该用户,但该用户没有密码
-- 所以这样使用需要特别慎重
GRANT ALL ON myDatabase.* TO 'someuser'@'somehost';
-- 3.赋予someuser@somehost这个用户在myDatabase上的所有权限
-- 如果用户不存在,则创建用户,密码为:somepassword
GRANT ALL ON myDatabasse.* TO 'someuser'@'somehost' IDENTIFIED BY 'somepassword';
-- 4. 赋予someuser@somehost这个用户在myDatabase上的权限
-- 该用户仅有SELECT和INSERT权限
GRANT SELECT, INSERT ON myDatabase.* TO 'someuser'@'somehost';
-- 5. 赋予someuser@somehost这个用户在myDatabase上myTbl表的权限
-- 该用户仅有myDatabase。myTbl上的SELECT和INSERT权限
GRANT SELECT, INSERT ON myDatabase.myTbl TO 'someuser'@'somehost';
-- 6. 赋予someuser@somehost这个用户在myDatabase上myTbl表的权限
-- 该用户仅有myDatabase.myTbl上某些列上有权限:
-- myTbl的colName1有SELECT和INSERT权限
-- myTbl的colName2只有INSERT权限
GRANT SELECT (colName1), INSERT(ColName1,ColName2) ON myDatabase.myTbl TO 'someuser'@'somehost';
怎么样,权限粒度可大可小吧,大至全局,小至单列,设置运用都能自如,很有成就感吧?不过需要注意,权限设置完毕之后,如果要马上生效,记得FLUSH PRIVILEGES
一下哦。
REVOKE 作为权限撤消语句,和GRANT语句匹配,自然使用的权限列表和GRANT要一样。REVOKE的官方语法是:
REVOKE
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
FROM user [, user] ...
REVOKE ALL PRIVILEGES, GRANT OPTION
FROM user [, user] ...
如果你和我一样,对官方文档中复杂的语法结构描述相当头疼,那么可以看看下面REVOKE常用的语法格式就好了,当然,这只是为了快速理解语法,如果在实际使用中,碰到实际问题,建议还是要深读官方晦涩的标准文档的:
REVOKE 权限类型1[(回收权限的列对象列表)], 权限类型2[(要回收权限的列对象列表)]... ON [对象类型] 权限级别 FROM 要回收权限的用户1 [,要回收权限的用户2]..
REVOKE直接回收FROM后面的用户的权限,要咋回收,就要靠ON指定回收区域,而后REVOKE在根据要回收的权限类型,在这个区域进行回收用户的权限。如果你要回收某用户的所有权限,那么可以简单的使用下面这样的语句:
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 要回收权限的用户
为什么要ALL PRIVILEGES之后还要GRANT OPTION? —— 请参见前面的权限列表哦。
好了,来几个例子享受下:
/*
===================================================
; blog.useasp.net
; Mitchell Chu
; MySql用户权限配置管理
; REVOKE 语法示例
; 下面语法并不是一起的,每个示例为单独说明某一问题而存在
===================================================
*/
-- 1.回收someuser@somehost这个用户所有权限
-- 注意: REVOKE并不会删除用户,即使权限被你扒光
-- 另外:如果你没有指定@后面的host,默认是使用%
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'someuser'@'somehost';
-- 2.回收someuser@somehost这个用户在myDatabase上的DROP权限
REVOKE DROP ON myDatabase.* FROM 'someuser'@'somehost';
-- 3.更多示例 —— 没有更多了
-- 请参见GRANT中的信息,自己自由组合:D
记住:在回收完用户权限之后,如果是要删除用户,还需要DROP USER或者到mysql.user中DELETE 一下,不然用户还存在的。要立即生效,也要记得FLUSH PRIVILEGES哦。为什么要使用FLUSH PRIVILEGES?这个是告诉系统,我们已经更改了权限,请你清除缓存,重新到用户权限表中获取新的权限的意思。
说了上面这么一些,有人就要问了,我该怎么知道现在某个用户有什么权限呢?Good question!这个问题也困扰了菜鸟级的我,后来才发现,应该使用的是SHOW GRANTS语句,语法如下:
SHOW GRANTS FOR user;
user就是你要查看权限的用户,如果你不使用@host的方式,默认host是%。如果要查看当前登录用户的权限你就可以使用下面这些语句中的任意一个了:
SHOW GRANTS;
SHOW GRANTS FOR CURRENT_USER;
SHOW GRANTS FOR CURRENT_USER();
而如果你是要查看当前系统下,所有用户的权限分配情况,怎么处理呢?可以试试下面的语句:
/*
===================================================
; blog.useasp.net
; Mitchell Chu
; MySql用户权限配置管理
; SHOW GRANTS 语法示例
; 下面语法并不是一起的,每个示例为单独说明某一问题而存在
===================================================
*/
-- 如果是Linux下,可参照下面的语句,也可参照Windows下的写法,带上其他参数.
mysql -Bse "SELECT DISTINCT CONCAT('SHOW GRANTS FOR \'', user ,'\'@\'', host, '\';') FROM mysql.user" | mysql -Bs | sed 's/$/;/g'
-- Windows下,用下面的方法试试咯,没有sed嘛
mysql -Bse "SELECT DISTINCT CONCAT('SHOW GRANTS FOR \'', user, '\'@\'', host, '\';') FROM mysql.user" -uroot -p |mysql -Bs -uroot -p
怎么样,所有的用户权限都出来了吧。