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