# MySQL教程 - 14 用户与权限
用户与权限管理属于 SQL 中的 DCL(数据控制语言),用来管理数据库用户、用户对数据库访问的权限。
数据库的用户与权限管理,一般都是数据库管理员使用,开发者一般用的不多。
我们前面连接数据库的时候使用的是 root
用户,它拥有全部权限,在实际生产使用时很危险的。一般的操作是,我们会创建不同的用户,针对不同的用户授予不同数据库的操作权限。
# 14.1 用户管理
# 1 查看用户
查看 DBMS 中有哪些用户,用户的信息是保存在名称为 mysql
的数据库中的 user
表中的,所以通过如下方式可以查看所有的用户信息:
-- 切换到mysql数据库
USE mysql;
-- 查看user表数据
SELECT * FROM user;
1
2
3
4
5
2
3
4
5
执行结果如下:
查询出来为什么有两个 root 用户?
表中定义的是用户及其允许从哪些主机(或 IP 地址)连接到数据库,所以是通过 Host
和 User
才能确认一个用户的访问权限。
% root
:表示 root 用户可以从任意主机连接到数据库;localhost root
: 表示只允许在本机上使用该用户连接到数据库,可以看到其他的用户都只能在本机上使用。
# 2 创建用户
创建用户使用如下指令:
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
1
举个栗子:
-- 创建foooor用户,只能本机连接,密码123456
CREATE USER 'foooor'@'localhost' IDENTIFIED BY '123456';
-- 创建foooor用户,在192.168.1.100主机上可以连接,密码123456
CREATE USER 'foooor'@'192.168.1.100' IDENTIFIED BY '123456';
-- 创建foooor用户,任意主机上可连接,密码123456
CREATE USER 'foooor'@'%' IDENTIFIED BY '123456';
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
%
表示任意主机上,使用该用户可以了连接
# 3 修改用户密码
修改用户密码使用如下指令:
-- 修改用户密码
ALTER USER '用户名'@'主机名' IDENTIFIED BY '新密码';
-- 举个栗子,
-- 修改foooor用户使用localhost的连接密码为1234
ALTER USER 'foooor'@'localhost' IDENTIFIED BY '1234';
-- 修改foooor用户,在任意主机上的连接密码为1234
ALTER USER 'foooor'@'%' IDENTIFIED BY '1234';
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 4 删除用户
删除用户使用如下指令:
-- 删除用户
DROP USER '用户名'@'主机名';
-- 删除foooor用户在本机上的访问权限
DROP USER 'foooor'@'localhost';
-- 删除foooor用户在所有主机上的访问权限
DROP USER 'foooor'@'%';
1
2
3
4
5
6
7
2
3
4
5
6
7
# 14.2 权限管理
上面创建了用户,但是用户只能连接数据库,并没有赋予访问某个数据库的权限。
常用的权限有以下几种,可以授权给用户进行对应的操作:
权限 | 说明 |
---|---|
ALL、ALL PRIVILEGES | 所有权限 |
SELECT | 插入数据 |
INSERT | 插入数据 |
UPDATE | 修改数据 |
DELETE | 删除数据 |
ALERT | 修改表 |
DROP | 删除数据库/表/视图 |
CREATE | 创建数据库/表 |
# 1 查询权限
查看某个用户在指定主机上访问的权限,命令如下:
SHOW GRANTS FOR '用户名'@'主机名';
1
举个栗子:
-- 查询foooor用户在localhost上的访问权限
SHOW GRANTS FOR 'foooor'@'localhost';
-- 查询foooor用户在任意主机上的访问权限
SHOW GRANTS FOR 'foooor'@'%';
1
2
3
4
5
2
3
4
5
执行结果:
USAGE
就表示没有权限,只有连接权限;
# 2 授予权限
授予权限使用 GRANTS
关键字,语法如下:
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
1
举个栗子:
-- 对foooor用户在localhost主机上,对db_foooor数据库中tb_employee表,授予查询权限
GRANT SELECT ON db_foooor.tb_employee TO 'foooor'@'localhost';
-- 对foooor用户在任意主机上,对db_foooor数据库中tb_employee表,授予查询和更新权限
GRANT SELECT,UPDATE ON db_foooor.tb_employee TO 'foooor'@'%';
-- 对foooor用户在任意主机上,对db_foooor数据库中tb_employee表,授予所有权限
GRANT ALL ON db_foooor.tb_employee TO 'foooor'@'%';
-- 对foooor用户在任意主机上,对db_foooor数据库中所有表,授予所有权限
GRANT ALL ON db_foooor.* TO 'foooor'@'%';
-- 对foooor用户在localhost主机上,对所有数据库中所有表,授予所有权限
GRANT ALL ON *.* TO 'foooor'@'localhost';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
- 可以使用
*
通配符匹配所有表或所有数据库。 - 不要在任意主机上授权用户所有数据库所有权限,非常不安全。
执行 GRANT ALL ON db_foooor.tb_employee TO 'foooor'@'%';
后,查询权限如下:
# 3 撤销权限
撤销权限使用 REVOKE
关键字,语法如下:
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
1
举个栗子:
-- 对foooor用户在localhost主机上,撤销其对db_foooor数据库中tb_employee表的查询权限
REVOKE SELECT ON db_foooor.tb_employee FROM 'foooor'@'localhost';
-- 对foooor用户在任意主机上,撤销其对db_foooor数据库中tb_employee表的查询和更新权限
REVOKE SELECT,UPDATE ON db_foooor.tb_employee FROM 'foooor'@'%';
-- 对foooor用户在任意主机上,撤销其对db_foooor数据库中tb_employee表的所有权限
REVOKE ALL ON db_foooor.tb_employee FROM 'foooor'@'%';
-- 对foooor用户在任意主机上,撤销其对db_foooor数据库中所有表的所有权限
REVOKE ALL ON db_foooor.* FROM 'foooor'@'%';
-- 对foooor用户在localhost主机上,撤销其对所有数据库中所有表的所有权限
REVOKE ALL ON *.* FROM 'foooor'@'localhost';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
← 13-事务