收回用户的权限就是取消已经赋于用户的某些权限。例如,如果数据库管理员觉得某个用户不应该拥有DELETE权限,那么就可以将DELETE权限收回。收回用户不必要的权限可以在一定程度上保证系统的安全性。MySQL中使用REVOKE语句取消用户的某些权限。使用REVOKE收回权限以后,用户账户的记录将从db、host、tables_priv和columns_priv表中删除,但是用户账号记录仍然在user表中保存。
可以使用DROP USER语句删除user表中的账户记录。
在将用户账户从user表删除之前,应该收回相应用户的所有权限。
REVOKE语句有两种语法格式。第一种语法是收回所有用户的所有权限,此语法用于取消对于已命名的用户的所有全局层级、数据库层级、表层级和列层级的权限。基本的语法格式如下:
REVOKE ALL PRIVILEGES,GRANT OPTION FROM 'user'@'host' [,'user'@'host',...]
REVOKE语句必须和FROM语句一起使用,FROM语句指明需要收回权限的账户。
第二种语法是收回指定的权限。基本的语法格式如下:
REVOKE priv_type [(columns)][,priv_type[(columns)]],...
ON table1,table2,...,tablen
FROM 'user'@'host'[,'user'@'host'...]
其中:
priv_type参数表示权限的类型。
columns参数表示权限作用于哪些列上。如果不指定该参数,表示作用于整个表。
table1,table2,...,tablen表示从哪个表中收回权限。
'user'@'host'参数表示用户账户,由用户名和主机名构成。
要使用REVOKE语句,必须拥有mysql数据库的全局CREATE USER权限或UPDATE权限。
实例1
收回test2用户的UPDATE权限。
1. 使用SELECT语句查看test2用户的SELECT权限、UPDATE权限和GRANT权限。SELECT语句的执行结果如下:
从上图中代码执行的结果可以看出,Select_priv、Update_priv和Grant_priv的值都为Y。
2. 收回test2用户的UPDATE权限。REVOKE语句的SQL代码如下:
mysql>REVOKE UPDATE ON *.* FROM 'test2'@'localhost';
执行结果如下:
结果显示,REVOKE语句执行成功。使用SELECT语句查看test2用户的UPDATE权限。SELECT语句的执行结果如下:
查询结果显示,Update_priv的值为N,说明test2用户的UPDATE权限已经收回。
实例2
收回test2用户的所有权限。REVOKE语句的SQL代码如下:
mysql>REVOKE ALL PRIVILEGES,GRANT OPTION FROM 'test2'@'localhost';
执行结果如下:
结果显示,REVOKE语句执行成功。使用SELECT语句查询test2用户的SELECT权限、UPDATE权限和GRANT权限。执行结果如下:
结果显示,Select_priv、Update_priv和Grant_priv的值都为N。说明tst2用户的这些权限都被收回了。
提示
当从旧版本的MySQL升级时,如果要使用EXECUTE、CREATE VIEW、SHOW VIEW、CREATE USER、CREATE ROUTINE和ALTER ROUTINE权限,则必须首先升级授权表。
数据库管理员给普通用户授权时一定要特别小心,如果授权不当,可能会给数据库带来致命的破坏。一旦发现给用户的授权太多,应该尽快使用REVOKE语句将权限收回。此处应特别注意,最好不要授予普通用户SUPER权限和GRANT权限。