# MySQL教程 - 14 用户与权限

用户与权限管理属于 SQL 中的 DCL(数据控制语言),用来管理数据库用户、用户对数据库访问的权限。

数据库的用户与权限管理,一般都是数据库管理员使用,开发者一般用的不多。

我们前面连接数据库的时候使用的是 root 用户,它拥有全部权限,在实际生产使用时很危险的。一般的操作是,我们会创建不同的用户,针对不同的用户授予不同数据库的操作权限。

# 14.1 用户管理

# 1 查看用户

查看 DBMS 中有哪些用户,用户的信息是保存在名称为 mysql 的数据库中的 user 表中的,所以通过如下方式可以查看所有的用户信息:

-- 切换到mysql数据库
USE mysql;

-- 查看user表数据
SELECT * FROM user;
1
2
3
4
5

执行结果如下:

查询出来为什么有两个 root 用户?

表中定义的是用户及其允许从哪些主机(或 IP 地址)连接到数据库,所以是通过 HostUser 才能确认一个用户的访问权限。

  • % 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
  • % 表示任意主机上,使用该用户可以了连接

# 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

# 4 删除用户

删除用户使用如下指令:

-- 删除用户
DROP USER '用户名'@'主机名';

-- 删除foooor用户在本机上的访问权限
DROP USER 'foooor'@'localhost';
-- 删除foooor用户在所有主机上的访问权限
DROP USER 'foooor'@'%';
1
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

执行结果:

  • 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
  • 可以使用 * 通配符匹配所有表所有数据库
  • 不要在任意主机上授权用户所有数据库所有权限,非常不安全。

执行 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