Skip to content

DCL

【数据控制语言】 控制数据库 用户, 控制数据库的访问权限

提示

在 mysql 数据库中,用户信息,用户具有的权限信息 都是存放在系统数据库 mysqluser 表中

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';