10.4.4 GRANT和REVOKE命令
GRANT和REVOKE命令用来管理访问权限。如前所述,还可以用来创建和删除用户,但在MySQL 5.0.2中可以利用CREATE USER和DROP USER命令更容易地实现这些任务。GRANT和REVOKE命令对于谁可以操作服务器及其内容的各个方面提供了多维度控制,从谁可以关闭服务器,到谁可以修改特定表字段中的信息都能控制。下面列出了使用这些命令可以授予或撤回的所有权限。
GRANT和REVOKE管理的权限:
➢ ALL PRIVILEGES:影响除WITH GRANT OPTION之外的所有权限
➢ ALTER:影响ALTER TABLE命令的使用
➢ ALTER ROUTINE:影响创建存储过程的能力
➢ CREATE:影响CREATE TABLE命令的使用
➢ CREATE ROUTINE:影响更改和弃用存储过程的能力
➢ CREATE TEMPORARY TABLES:影响CREATE TEMPORARY TABLE命令的使用
➢ CREATE USER:影响创建、弃用;重命名和撤销用户权限的能力
➢ CREATE VIEW:影响CREATE VIEW命令的使用
➢ DELETE:影响DELETE命令的使用
➢ DROP:影响DROP TABLE命令的使用
➢ EXECUTE:影响用户运行存储过程的能力
➢ EVENT:影响执行事件的能力(从MySQL5.1.6开始)
➢ FILE:影响SELECT INITO OUTFILE和LOAD DATA INFILE的使用
➢ GRANT OPTION:影响用户委派权限的能力
➢ INDEX:影响CREATE INDEX和DROP INDEX命令的使用
➢ INSERT:影响INSERT命令的使用
➢ LOCK TABLES:影响LOCK TABLES命令的使用
➢ PROCESS:影响SHOW PROCESSLIST命令的使用
➢ REFERENCES:未来MySQL特性的占位符
➢ RELOAD:影响FLUSH命令集的使用
➢ REPLICATION CLIENIT:影响用户查询从服务器和主服务器位置的能力
➢ REPLICATION SLAVE:复制从服务器所需的权限
➢ SELECT:影响SELECT命令的使用
➢ SHOW DATABASES:影响SHOW DATABASES命令的使用
➢ SHOW VIEW:影响SHOW CREATE VIEW命令的使用
➢ SHUTDOWN:影响SHUTDOWN命令的使用
➢ SUPER:影响管理员级命令的使用,如MASTER LOGS
➢ TRIGGER:影响执行触发器的能力(从MySQL5.1.6开始)
➢ UPDATE:影响UPDATE命令的使用
➢ USAGE:只连接,不授予权限
本节将详细介绍GRANT和REVOKE命令,后面提供几个示例来展示其用法。
1.GRANT
当需要为用户或用户组赋予新权限时,使用GRANT命令。权限指定可能很简单,如只授权用户能连接到数据库服务器,也可能复杂到提供一些root MySQL访问(当然不推荐这样做,但这是可能的)。此命令语法如下:
GRANT语法看着比较复杂,但实际上使用很简单。后面几节将给出一些示例,有助于更好地熟悉这个命令。
➢ 创建新用户并赋予初始权限
第一个示例创建一个新用户,并为其赋予一些数据库特定的权限。用户“Michele”将从IP地址“192.168.1.103”,使用密码“secret”连接到数据库服务器。接下来为其提供对books数据库中所有表的SELECT和INSERT权限:
执行之后,将修改两个权限表,即user和db表。因为user表负责访问验证和全局权限,所以必然插入了一个新记录,标识此用户。不过,此记录中的所有权限都必须禁用。因为GRANT命令只特定于books数据库。db表将包含相关的用户信息,将用户michele映射到books表,并启用Select_priv和Insert_priv字段。
➢ 向现有用户增加权限
现在假设用户michele需要对books数据库中所有表的UPDATE权限。这也可以通过GRANT实现:
执行之后,db表中标识用户michele@192.168.1.103的行会修改,这样可启用Update_priv列。注意,向现有用户增加权限时不需要重提供密码。
➢ 授予表级权限
现在假设除了前面定义的权限外,用户michele@192.168.1.103需要对books数据库中的两个表authors和editor表有DELETE权限。并非完全允许此用户删除数据库中任何表的数据,而是可以限制其权限,只能删除这两个特定表的数据。因为涉及两个表,所以需要两个GRANT命令:
因为这是表特定的权限设置,所以只触及了tables_priv表,执行之后,将向tables_priv表增加两条新记录。这里假设之前没有将authors表和editors表映射到michele@192.168.1.103的记录。如果已经存在这样的记录,则会相应地修改现有的记录,反映表特定的新权限。
➢ 授予多个表级权限
对前面的示例稍做修改,为用户提供针对一个给定表的多个权限。假设一个新用户rita从wjgilmore.com域中的多个地址连接,要求更新作者信息,因此只需要authors表的SELECT、INSERT和UPDATE权限:
执行此GRANT语句将在mysql数据库中增加两个新项:user表中将有一条新记录(再次说明,这只是为rita@% .wjgi Imore.com提供访问权限),tables_priv表中也将有一条新记录,指定应用于authors表的新访问权限。记住,因为这些权限只应用于一个表,所以只向tables_priv表增加了一条记录,其Table_priv字段值为Select.Insert.Delete。
➢ 授予字段级权限
最后,考虑一个只影响表中列级权限的示例。假设希望为用户nino@192.168.1.105授予books.authors.name的UPOATE权限:
2.撤回权限
REVOKE命令负责删除之前授予用户或用户组的权限。语法如下:
与GRANT一样,要理解这个命令的用法,最好的方法是通过一些示例。以下示例展示了如何撤回现有用户的权限,甚至删除现有用户。
➢ 撤回以前授予的权限
有时需要删除以前为特定用户授予的一个或多个权限。例如,假设希望删除用户rita@192.168.1.102对数据库books的UPDATE权限:
➢ 撤回表级权限
现在假设希望撤回之前为用户rita@192.168.1.102授予的对数据库books中表authors的UPDATE和INSERT权限:
注意,此示例假设已经为用户rita@192.168.1.102授予了表级权限。REVOKE命令不会将数据库级GRANT(位于db表)降级,即不会删除db表中的项,而在tables_priv表中插入一项。相反,在这种情况下,它只是删除tables_priv表中的这些权限引用。如果tables_priv表中只引用了这两个权限,则删除整行。
➢ 撤回列级权限
作为最后一个撤回的示例,假设之前已经为用户rita@192.168.1.102针对books。authors的字段name授予了列级INSERT权限,。现在要删除此权限:
在所有这些使用REVOKE的示例中,如果rita的某些权限在REVOKE命令中没有显式地引用,则用户rita仍能够在指定数据库中使用这些权限。如果希望该用户失去所有权限,可以撤回所有权限,如下:
但是,如果要从mysql数据库中完全删除该用户,请阅读下一节。
➢ 删除用户
关于REVOKE的一个常见问题是如何删除用户。这个问题的答案很简单,它根本不会删除用户。例如,假设撤回了特定用户的所有权限,使用如下命令:
虽然这个命令确实删除了db表中与rita@192.168.1.102和books数据库的关系有关的所有记录,但没有从user表中删除该用户的项,这样以后就可以重新恢复此用户,而无须重置其密码。如果确定将来不会再使用该用户,则需要手工使用DELETE命令(从user表)删除该行。
当然如果运行MySQL 5.0.2或更高版本,可以考虑使用DROP USER命令来同时删除用户和所有权限。
3.GRANT和REVOKE提示
以下列出了使用GRANT和REVOKE时要记住的各个提示。
➢ 可以为不存在的数据库授权。
➢ 如果GRANT命令标识的用户不存在,它将被创建。
➢ 如果创建一个用户而没有包括IDENTIFI印BY子句,则不需要密码就能登录。
➢ 如果现有用户被授予新权限,并且在GRANT命令中使用IDENTIFIED BY子句,则该用户的旧密码将被新密码代替。
➢ 表级GRANT只支持如下权限类型:ALTER、CREATE、CREATE VIEW、DELETE、DROP、GRANT、INDEX、INSERT、REFERENCES、SELECT、SHOW VIEW和UDATE.
➢ 列级GRANT只支持以下权限类型:INSERT、SELECT和UPDATE。
➢ 在GRANT命令中引用数据库名和主机名时,支持和%通配符。因为字符在MySQL数据库名中也是合法字符,所以如果在GRANT中用到,需要用反斜线进行转义。
➢ 如果希望创建和删除用户,而且运行的是MySQL 5.0.2或更高版本,可以考虑使用CREATE USER和DROP USER命令。
➢ 不能引用*,*来删除某用户对所有数据库的权限。相反,必须用单独的REVOKE命令逐个显式地引用每一个权限。
4.查看权限
虽然可以通过从权限表中选择适当的数据来查看用户权限,但随着表的增大,这种策略会变得越来越难以使用。幸运的是,MySQL提供了一些更方便的方法来查询用户特定的权限(实际上是两种)。SHOW GRANTS FOR命令的使用有两种方法。
SHOW GRANTS FOR用户命令显示授予特定用户的权限。例如:
这个命令将生成一个表,其中包括该用户的授权信息(包括加密的口令),以及在全局级、数据库级、表级和列级授予的权限。如果想查看当前登录用户的权限,可以使用current—user()函数,如下所示:
与GRANT和REVOKE命令类似,使用SHOW GRANTS命令时必须指出用户名和源主机来唯一标识目标用户。