DCL的基本语法(授权)
1、DCL的基本介绍
DCL(Data Control Language),即数据控制语言,用来定义数据库的访问权限和安全级别,及创建用户。主要包括创建用户、给用户授权、对用户撤销授权、查询用户授权和删除用户等。
DCL 语句主要是 DBA(数据库管理员) 用来管理系统中的对象权限时所使用,一般的开发人员很少使用。
2、管理用户
2.1、查询用户
MySQL 在安装完成之后,默认会生成四个数据库:mysql、performance_schema、test,其中 mysql 数据库的 user 表就存放着用户的数据。
查询用户:
USE myql; -- 切换到mysql数据库 SELECT * FROM USER; -- 查询user表
查询结果:
上面实际上查询到的两条记录都是同一个用户 root,host 字段表示该用户可以在哪台主机上连接该数据库,通配符 % 表示可以在任意主机使用该用户来远程登录数据库。
2.2、创建用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码'; -- 如果不指定host,则默认为%,密码可以为空。 -- 实例: CREATE USER 'wen'@'192.168.118.1' IDENTIFIED BY '123';
创建后查询结果:
创建语法中指定的主机名是指定该用户可以通过什么主机名来连接本数据库,在使用图形工具比如 Navicat 时,指定的是下面的主机:
比如创建某一用户时设置他的主机名为 localhost,则该用户在连接该数据库时,只能通过 localhost 主机名来进行连接,通过数据库服务器的 IP 地址或者其他地址都无法连接到该数据库。设置为 '%' 时,表示可以使用任何地址,也就是只要能连接到该数据库,使用 ip 或者 localhost 或者其他的地址都行。
2.3、删除用户
删除用户命令:
drop user 用户名@IP; -- 实例: drop user 'zhangsan'@'192.168.32.1';
2.4、修改用户密码
UPDATE `user` SET `Password` = PASSWORD('新密码') WHERE `User` = '用户名'; -- 实例: UPDATE `user` SET `Password` = PASSWORD('111') WHERE `User` = 'zhangsan';
注意,修改用户密码后需要重启 MySQL 服务才能生效,否则仍是旧密码。
2.5、忘记root用户的密码怎么办
在 MySQL 中忘记了 root 用户的密码可以通过以下方式重新设置 root 的密码:
- 用管理员运行 cmd,通过命令 net stop mysql 停止mysql服务
- 使用无验证方式启动mysql服务,输入命令:mysqld --skip-grant-tables
- 重新打开一个新的窗口,直接输入mysql,就可以无用户名,无密码直接登陆
- 然后用用修改密码的命令来修改root密码。比如先选中 mysql 数据库,然后通过 update 修改密码:use mysql; UPDATE user SET Password = PASSWORD('新密码') WHERE User = '用户名';
- 关闭开启的两个窗口
- 打开任务管理器,手动结束 mysql.exe 的进程
- 重新启动mysql服务,这时就可以使用新密码进行登陆了
3、权限管理
常用权限:
- 表数据: select, update, delete, insert
- 表结构: create, alert, drop
- 外键: references
- 创建临时表: create temporary tables
- 操作索引: index
- 视图: create view, show view
- 存储过程: create routine, alert routine, execute
- 所有权限: all
3.1、查看用户权限
查看用户权限命令:
SHOW GRANTS FOR '用户名'@'主机名'; -- 实例: SHOW GRANTS FOR 'root'@'%';
比如,我们查看 root 用户的权限:
可以看到,基本所有权限都列出来了。
查看 zhangsan 用户的权限:
可以看到只有登录的权限。
3.2、给用户授予权限(grant)
在MySQL中使用GRANT命令给用户授权,如果用户不存在,GRANT会自动创建用户,并进行授权。
命令格式:
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名'; -- 权限列表中如果有多个权限则用逗号,隔开 -- 授权所有库的所有表的所有权限 GRANT ALL ON *.* TO '用户名'@'主机名'; -- 示例:给张三赋予db_test数据库students表的查询权限 GRANT SELECT ON db_test.students TO 'zhangsan'@'localhost';
上面给张三授权之后,再次查看张三权限可以看到增加了查看 db_test.students 表的权限:
只有给某一用户授予了指定数据库或者指定表的权限之后,该用户才能看到该数据库和表,否则根本就无法查看到该数据库或者表的存在。上面只授予了查询的权限,所以使用 zhangsan 用户来进行删除、插入等操作一律不会执行成功。
3.3、撤销权限
可以通过命令撤销某用户的某种权限,格式如下:
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名'; -- 示例:撤销张三在db_test.students表的查询权限 REVOKE SELECT ON db_test.students FROM 'zhangsan'@'localhost';