在对 MySQL 的日常管理和实际操作中,为了数据库的安全,避免恶意用户使用 root 账号控制数据库,我们通常会创建一系列具备适当权限的账号.这样,我们就可以不用或少用 root 账号登录NySQL数据库,在一定程度上确保数据的安全访问.本文介绍MySQL数据库如何对用户进行授权.
授予用户权限
对于新建的 MySQL 用户,必须给它授权,可以用 GRANT 语句来实现对新建用户的授权.
语法格式:GRANT
[ ( ) ] [ , [ ( ) ] ]
ON TO
其中的格式:
[ IDENTIFIED ] BY [ PASSWORD ]
[ WITH GRANT OPTION]
| MAX_QUERIES_PER_HOUR
| MAX_UPDATES_PER_HOUR
| MAX_CONNECTIONS_PER_HOUR
| MAX_USER_CONNECTIONS
语法说明如下:
1. 权限类型
GRANT语句中的的使用说明如下:
1.1 授予数据库权限时,可以指定为以下值:
SELECT: 表示授予用户可以使用 SELECT 语句访问特定数据库中所有表和视图的权限.
INSERT: 表示授予用户可以使用 INSERT 语句向特定数据库中所有表添加数据行的权限.
DELETE: 表示授予用户可以使用 DELETE 语句删除特定数据库中所有表的数据行的权限.
UPDATE: 表示授予用户可以使用 UPDATE 语句更新特定数据库中所有数据表的值的权限.
REFERENCES: 表示授予用户可以创建指向特定的数据库中的表外键的权限.
CREATE: 表示授权用户可以使用 CREATE TABLE 语句在特定数据库中创建新表的权限.
ALTER: 表示授予用户可以使用 ALTER TABLE 语句修改特定数据库中所有数据表的权限.
SHOW VIEW: 表示授予用户可以查看特定数据库中已有视图的视图定义的权限.
CREATE ROUTINE: 表示授予用户可以为特定的数据库创建存储过程和存储函数的权限.
ALTER ROUTINE: 表示授予用户可以更新和删除数据库中已有的存储过程和存储函数的权限.
INDEX: 表示授予用户可以在特定数据库中的所有数据表上定义和删除索引的权限.
DROP: 表示授予用户可以删除特定数据库中所有表和视图的权限.
CREATE TEMPORARY TABLES: 表示授予用户可以在特定数据库中创建临时表的权限.
CREATE VIEW: 表示授予用户可以在特定数据库中创建新的视图的权限.
EXECUTE ROUTINE: 表示授予用户可以调用特定数据库的存储过程和存储函数的权限.
LOCK TABLES: 表示授予用户可以锁定特定数据库的已有数据表的权限.
ALL 或 ALL PRIVILEGES: 表示以上所有权限.
1.2 授予表权限时,可以指定为以下值:
SELECT: 授予用户可以使用 SELECT 语句进行访问特定表的权限.
INSERT: 授予用户可以使用 INSERT 语句向一个特定表中添加数据行的权限.
DELETE: 授予用户可以使用 DELETE 语句从一个特定表中删除数据行的权限.
DROP: 授予用户可以删除数据表的权限.
UPDATE: 授予用户可以使用 UPDATE 语句更新特定数据表的权限.
ALTER: 授予用户可以使用 ALTER TABLE 语句修改数据表的权限.
REFERENCES: 授予用户可以创建一个外键来参照特定数据表的权限.
CREATE: 授予用户可以使用特定的名字创建一个数据表的权限.
INDEX: 授予用户可以在表上定义索引的权限.
ALL 或 ALL PRIVILEGES: 所有的权限名.
1.3 授予列权限时,的值只能指定为 SELECT、INSERT 和 UPDATE,同时权限的后面需要加上列名列表 column-list.
1.4 最有效率的权限是用户权限
授予用户权限时,除了可以指定为授予数据库权限时的所有值之外,还可以是下面这些值:
CREATE USER: 表示授予用户可以创建和删除新用户的权限.
SHOW DATABASES: 表示授予用户可以使用 SHOW DATABASES 语句查看所有已有的数据库的定义的权限.
2. 列名
可选项.用于指定权限要授予给表中哪些具体的列.
3. ON 子句
用于指定权限授予的对象类型和级别,如在 ON 关键字后面给出要授予权限的数据库名或表名等.
4. 权限级别
用于指定权限的级别.可以授予的权限有如下几组:
列权限,和表中的一个具体列相关.例如,可以使用 UPDATE 语句更新表 students 中 student_name 列的值的权限.
表权限,和一个具体表中的所有数据相关.例如,可以使用 SELECT 语句查询表 students 的所有数据的权限.
数据库权限,和一个具体的数据库中的所有表相关.例如,可以在已有的数据库 mytest 中创建新表的权限.
用户权限,和 MySQL 中所有的数据库相关.例如,可以删除已有的数据库或者创建一个新的数据库的权限.
对应地,在 GRANT 语句中可用于指定权限级别的值有以下几类格式:
*: 表示当前数据库中的所有表.
*.*: 表示所有数据库中的所有表.
db_name.*: 表示某个数据库中的所有表,db_name 指定数据库名.
db_name.tbl_name: 表示某个数据库中的某个表或视图,db_name 指定数据库名,tbl_name 指定表名或视图名.
tbl_name: 表示某个表或视图,tbl_name 指定表名或视图名.
db_name.routine_name: 表示某个数据库中的某个存储过程或函数,routine_name 指定存储过程名或函数名.
5. TO 子句:用来设定用户口令,以及指定被赋予权限的用户 user
如果在 TO 子句中给系统中存在的用户指定口令,则新密码会将原密码覆盖;
如果权限被授予给一个不存在的用户,MySQL 会自动执行一条 CREATE USER 语句来创建这个用户,但同时必须为该用户指定口令.
举例:
使用 GRANT 语句创建一个新的用户 neil,密码为 123456.用户 neil 对所有的数据有查询、插入权限,并授予 GRANT 权限.输入的 SQL 语句和执行过程如下所示:// 创建用户neil,密码为123456,对所有数据有查询、删除权限并授予GRANT权限
GRANT SELECT,INSERT ON *.* TO 'neil'@'localhost'IDENTIFIED BY '123456' WITH GRANT OPTION;
// 刷新权限表
FLUSH PRIVILEGES;
执行完上述语句后,使用neil用户登录数据库,检测可以发现用户只有查询SELECT 和 插入 INSERT 的权限,执行其他操作如删除DELETE 或更新UPDATE时会出错.