主题
DCL 
【数据控制语言】 控制数据库 用户, 控制数据库的访问权限
提示
在 mysql 数据库中,用户信息,用户具有的权限信息 都是存放在系统数据库 mysql 的 user 表中
host + user 才能定位一个用户
host 指的是,当前的user只能在那个主机上访问当前 mysql 的服务
主机名可以用 % 通配,表示任意主机都可以访问该数据库服务器
DCL 这类 sql 开发人员操作较少,主要是 DBA 使用
管理用户 
- 查询用户
sql
use mysql;
select * from user;- 创建用户
sql
create user `用户名`@`主机名` identified by '密码';- 修改用户密码
sql
-- mysql_native_password 为密码加密方式
alter user `用户名`@`主机名`  identified with mysql_native_password by '新密码';- 删除用户
sql
drop user `用户名`@`主机名`;案例练习-管理用户 
sql
-- 创建用户 zhangsan,只能够在当前主机localhost访问,密码123456
create user 'zhangsan'@'localhost' IDENTIFIED by '123456';
-- 创建用户 lisi,可以在任意主机访问该数据库,密码 123456
create user 'lisi'@'%' identified  by '123456';
-- 修改 zhangsan 的访问密码 为1234
alter user 'zhangsan'@'localhost' identified  with mysql_native_password by '1234';
-- 删除 lisi@% 用户
drop user 'lisi'@'%';权限控制 
上一步创建好用户后,用户只能连接并登录系统库,就是因为用户权限不够
- 权限分类 
mysql 中定义了很多权限,但是我们常用的也就以下几种:
| 权限 | 说明 | 
|---|---|
| ALL、ALL PRIVILEGES | 所有权限 | 
| SELECT | 查询数据 的权限 | 
| UPDATE | 修改数据 的权限 | 
| DELETE | 删除数据 的权限 | 
| ALTER | 修改表 的权限 | 
| DROP | 删除数据库、表、视图 的权限 | 
| CREATE | 创建数据库、表 的权限 | 
权限控制语句 
- 查询用户权限
sql
SHOW GRANTS FOR '用户名'@'主机名';- 给用户授权
sql
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';- 撤销用户的权限
sql
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';注意
- 多个权限之间使用逗号分隔
- 若要给用户授权或撤销 所有数据库的所有表 ,数据库名.表名可以用*.*表示
案例练习-权限控制 
- 查询用户权限
sql
show grants for 'zhangsan'@'localhost';结果如下: 
USAGE 表示 zhangsan 这个用户,没有任何权限,只能连接并登录数据库而已
- 用户授权
sql
-- 给zhangsan这个用户授予 test 数据库的所有权限(test的所有表)
grant all on test.* to 'zhangsan'@'localhost';授权之前,查询 zhangsan 这个用户的权限,是查不到 test 这个数据库的
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| performance_schema |
+--------------------+授权之后再次查询,就已经能查到test这个数据库了
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| performance_schema |
| test               |
+--------------------+查询 zhangsan 用户的权限
sql
show grants for 'zhangsan'@'localhost';结果 
ALL PRIVILEGES 表示拥有所有权限(有 test 这个数据库的所有权限)
- 撤销权限
sql
-- 撤销 zhangsan这个用户的test数据库的所有权限
revoke all on test.* from 'zhangsan'@'localhost';