授权就是为某个用户赋予某些权限。例如,可以为新建的用户赋予查询所有数据库和表的权限。MySQL 提供了 GRANT 语句来为用户设置权限。
在 MySQL 中,拥有 GRANT 权限的用户才可以执行 GRANT 语句,其语法格式如下:
GRANT priv_type [(column_list)] ON database.table TO user [IDENTIFIED BY [PASSWORD] 'password'] [, user[IDENTIFIED BY [PASSWORD] 'password']] ... [WITH with_option [with_option]...]
其中:
WITH 关键字后面带有一个或多个 with_option 参数。这个参数有 5 个选项,详细介绍如下:
MySQL 中可以授予的权限有如下几组:
对应地,在 GRANT 语句中可用于指定权限级别的值有以下几类格式:
下面讲解 GRANT 语句中的权限类型。
权限名称 | 对应user表中的字段 | 说明 |
---|---|---|
SELECT | Select_priv | 表示授予用户可以使用 SELECT 语句访问特定数据库中所有表和视图的权限。 |
INSERT | Insert_priv | 表示授予用户可以使用 INSERT 语句向特定数据库中所有表添加数据行的权限。 |
DELETE | Delete_priv | 表示授予用户可以使用 DELETE 语句删除特定数据库中所有表的数据行的权限。 |
UPDATE | Update_priv | 表示授予用户可以使用 UPDATE 语句更新特定数据库中所有数据表的值的权限。 |
REFERENCES | References_priv | 表示授予用户可以创建指向特定的数据库中的表外键的权限。 |
CREATE | Create_priv | 表示授权用户可以使用 CREATE TABLE 语句在特定数据库中创建新表的权限。 |
ALTER | Alter_priv | 表示授予用户可以使用 ALTER TABLE 语句修改特定数据库中所有数据表的权限。 |
SHOW VIEW | Show_view_priv | 表示授予用户可以查看特定数据库中已有视图的视图定义的权限。 |
CREATE ROUTINE | Create_routine_priv | 表示授予用户可以为特定的数据库创建存储过程和存储函数的权限。 |
ALTER ROUTINE | Alter_routine_priv | 表示授予用户可以更新和删除数据库中已有的存储过程和存储函数的权限。 |
INDEX | Index_priv | 表示授予用户可以在特定数据库中的所有数据表上定义和删除索引的权限。 |
DROP | Drop_priv | 表示授予用户可以删除特定数据库中所有表和视图的权限。 |
CREATE TEMPORARY TABLES | Create_tmp_table_priv | 表示授予用户可以在特定数据库中创建临时表的权限。 |
CREATE VIEW | Create_view_priv | 表示授予用户可以在特定数据库中创建新的视图的权限。 |
EXECUTE ROUTINE | Execute_priv | 表示授予用户可以调用特定数据库的存储过程和存储函数的权限。 |
LOCK TABLES | Lock_tables_priv | 表示授予用户可以锁定特定数据库的已有数据表的权限。 |
ALL 或 ALL PRIVILEGES 或 SUPER | Super_priv | 表示以上所有权限/超级权限 |
权限名称 | 对应user表中的字段 | 说明 |
---|---|---|
SELECT | Select_priv | 授予用户可以使用 SELECT 语句进行访问特定表的权限 |
INSERT | Insert_priv | 授予用户可以使用 INSERT 语句向一个特定表中添加数据行的权限 |
DELETE | Delete_priv | 授予用户可以使用 DELETE 语句从一个特定表中删除数据行的权限 |
DROP | Drop_priv | 授予用户可以删除数据表的权限 |
UPDATE | Update_priv | 授予用户可以使用 UPDATE 语句更新特定数据表的权限 |
ALTER | Alter_priv | 授予用户可以使用 ALTER TABLE 语句修改数据表的权限 |
REFERENCES | References_priv | 授予用户可以创建一个外键来参照特定数据表的权限 |
CREATE | Create_priv | 授予用户可以使用特定的名字创建一个数据表的权限 |
INDEX | Index_priv | 授予用户可以在表上定义索引的权限 |
ALL 或 ALL PRIVILEGES 或 SUPER | Super_priv | 所有的权限名 |
授予用户权限时,<权限类型>除了可以指定为授予数据库权限时的所有值之外,还可以是下面这些值:
使用 GRANT 语句创建一个新的用户 testUser,密码为 testPwd。用户 testUser 对所有的数据有查询、插入权限,并授予 GRANT 权限。SQL 语句和执行过程如下。
mysql> GRANT SELECT,INSERT ON *.* -> TO 'testUser'@'localhost' -> IDENTIFIED BY 'testPwd' -> WITH GRANT OPTION; Query OK, 0 rows affected, 1 warning (0.05 sec)
使用 SHOW GRANTS 语句查询用户 testUser 的权限,如下所示。
mysql> SHOW GRANTS FOR 'testUser'@'localhost'; +-------------------------------------------------------------------------+ | Grants for testUser@localhost | +-------------------------------------------------------------------------+ | GRANT SELECT, INSERT ON *.* TO 'testUser'@'localhost' WITH GRANT OPTION | +-------------------------------------------------------------------------+ 1 row in set (0.00 sec)
结果显示,testUser 对所有数据库的所有表有查询、插入权限,并可以将这些权限赋予给别的用户。
数据库管理员给普通用户授权时一定要特别小心,如果授权不当,可能会给数据库带来致命的破坏。一旦发现给用户的权限太多,应该尽快使用 REVOKE 语句将权限收回。此处特别注意,最好不要授予普通用户 SUPER 权限,GRANT 权限。
在 MySQL 中,可以使用 REVOKE 语句删除某个用户的某些权限(此用户不会被删除),在一定程度上可以保证系统的安全性。例如,如果数据库管理员觉得某个用户不应该拥有 DELETE 权限,那么就可以删除 DELETE 权限。
使用 REVOKE 语句删除权限的语法格式有两种形式,如下所示:
删除用户某些特定的权限,语法格式如下:
REVOKE priv_type [(column_list)]... ON database.table FROM user [, user]...
REVOKE 语句中的参数与 GRANT 语句的参数意思相同。其中:
删除特定用户的所有权限,语法格式如下:
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...
删除用户权限需要注意以下几点:
使用 REVOKE 语句取消用户 testUser 的插入权限,SQL 语句和执行过程如下。
mysql> REVOKE INSERT ON *.* -> FROM 'testUser'@'localhost'; Query OK, 0 rows affected (0.01 sec) mysql> SHOW GRANTS FOR 'testUser'@'localhost'; +-----------------------------------------------------------------+ | Grants for testUser@localhost | +-----------------------------------------------------------------+ | GRANT SELECT ON *.* TO 'testUser'@'localhost' WITH GRANT OPTION | +-----------------------------------------------------------------+ 1 row in set (0.00 sec)
结果显示,删除 testUser 用户的 INSERT 权限成功。