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 DATABASESSHOW 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语句来为特定用户赋予权限:


; 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? —— 请参见前面的权限列表。

举例说明:

; 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';
-- 请参见GRANT中的信息,自己自由组合

记住:在回收完用户权限之后,如果是要删除用户,还需要DROP USER或者到mysql.user中DELETE 一下,不然用户还存在的。要立即生效,也要记得FLUSH PRIVILEGES哦。

为什么要使用FLUSH PRIVILEGES?这个是告诉系统,我们已经更改了权限,请你清除缓存,重新到用户权限表中获取新的权限的意思。

说了上面这么一些,有人就要问了,我该怎么知道现在某个用户有什么权限呢?使用的是SHOW GRANTS语句,语法如下:

SHOW GRANTS FOR user;

user就是你要查看权限的用户,如果你不使用@host的方式,默认host是%。如果要查看当前登录用户的权限你就可以使用下面这些语句中的任意一个了:

SHOW GRANTS;
SHOW GRANTS FOR CURRENT_USER;
SHOW GRANTS FOR CURRENT_USER();