MySQL之DCL(Data Control Language)
Posted 李子捌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL之DCL(Data Control Language)相关的知识,希望对你有一定的参考价值。
- 备战2022春招或暑期实习,本专栏会持续输出mysql系列文章,祝大家每天进步亿点点!文末私信作者,我们一起去大厂。
- 本篇总结的是 《DCL(Data Control Language)》,后续会每日更新~
- 关于《Redis入门到精通》、《并发编程》、《Java全面入门》、《鸿蒙开发》等知识点可以参考我的往期博客
- 相信自己,越活越坚强,活着就该逢山开路,遇水架桥!生活,你给我压力,我还你奇迹!
目录
一、简介
DCL(Data Control Language)指的是数据库控制语言,用于管理数据库用户、控制数据库的访问权限。
二、用户管理
2.1 查询用户
首先查询系统用户,在MySQL数据库中,用户存储在mysql数据库的user表中(mysql.user),因此可以使用有权限的用户(通常是root账户)来查询user表;通常有两种方式:
use mysql;
select * from user;
select * from mysql.user;
查询的结果如下所示:
在查询的结果中第一列Host代表可以访问的主机,第二列User代表访问数据库的用户名。MySQL中通过Host和User来标记一个用户,因此通常用户的表现形式为'user'@'host' 也就是'用户名'@'主机名'。后续列均表示当前用户所拥有的权限项,N代表无权限,Y代表有权限。
2.2 创建用户
创建用户的语法如下:
create user '用户名'@'主机名' identified by '密码';
案例1:创建一个用户名为liziba,密码为123456,且只允许本机访问的MySQL用户。
create user 'liziba'@'localhost' identified by '123456';
重新查询用户 select * from mysql.user,发现此时user表中新增了一条记录,值得注意的是,此时liziba这个用户,权限项的值都是N,表示当前用户并没有任何权限,这里就是后面会讲的用户授权。
案例2:创建一个用户名为liziqi,密码为123456,且允许任意主机访问的MySQL用户。
create user 'liziqi'@'%' identified by '123456';
在MySQL中,%通配符代表任意,如果当前用户需要通过任意主机访问MySQL,则可以使用%通配符,此时可以再次查询用户表,User为liziqi的用户,访问Host为%。
2.3 修改用户
通常情况下,修改用户用的最多的就是重置密码,虽然这类事情基本上是DBA/公司运维来负责,但我们自己也是需要了解的。
案例1:修改用户liziqi的密码为1234567
alter user 'liziqi'@'%' identified with mysql_native_password by '1234567';
语句中的mysql_native_password代表加密方式,我的MySQL版本为8.0.15,其默认的加密方式为caching_sha2_password,可以通过select version()查询版本号,通过select user,host,plugin from mysql.user;查看当前用户的登录校验的加密方式,如果客户端不支持caching_sha2_password加密的话,就可以通过上面的语句修改加密方式。
如下liziqi\\liziba\\root 是我修改过plugin之后的结果,mysql.infoschema\\mysql.session\\mysql.sys默认plugin为caching_sha2_password
2.4 删除用户
案例1:删除用户liziqi
drop user 'liziqi'@'%';
三、权限管理
MySQL中定义了很多权限,用户在不授权的情况下,无法操作MySQL数据库中的数据。在mysql.user的DDL中可以看到非常多的权限:
-- auto-generated definition
create table user
(
Host char(60) default '' not null,
User char(32) default '' not null,
Select_priv enum ('N', 'Y') charset utf8 default 'N' not null,
Insert_priv enum ('N', 'Y') charset utf8 default 'N' not null,
Update_priv enum ('N', 'Y') charset utf8 default 'N' not null,
Delete_priv enum ('N', 'Y') charset utf8 default 'N' not null,
Create_priv enum ('N', 'Y') charset utf8 default 'N' not null,
Drop_priv enum ('N', 'Y') charset utf8 default 'N' not null,
Reload_priv enum ('N', 'Y') charset utf8 default 'N' not null,
Shutdown_priv enum ('N', 'Y') charset utf8 default 'N' not null,
Process_priv enum ('N', 'Y') charset utf8 default 'N' not null,
File_priv enum ('N', 'Y') charset utf8 default 'N' not null,
Grant_priv enum ('N', 'Y') charset utf8 default 'N' not null,
References_priv enum ('N', 'Y') charset utf8 default 'N' not null,
Index_priv enum ('N', 'Y') charset utf8 default 'N' not null,
Alter_priv enum ('N', 'Y') charset utf8 default 'N' not null,
Show_db_priv enum ('N', 'Y') charset utf8 default 'N' not null,
Super_priv enum ('N', 'Y') charset utf8 default 'N' not null,
Create_tmp_table_priv enum ('N', 'Y') charset utf8 default 'N' not null,
Lock_tables_priv enum ('N', 'Y') charset utf8 default 'N' not null,
Execute_priv enum ('N', 'Y') charset utf8 default 'N' not null,
Repl_slave_priv enum ('N', 'Y') charset utf8 default 'N' not null,
Repl_client_priv enum ('N', 'Y') charset utf8 default 'N' not null,
Create_view_priv enum ('N', 'Y') charset utf8 default 'N' not null,
Show_view_priv enum ('N', 'Y') charset utf8 default 'N' not null,
Create_routine_priv enum ('N', 'Y') charset utf8 default 'N' not null,
Alter_routine_priv enum ('N', 'Y') charset utf8 default 'N' not null,
Create_user_priv enum ('N', 'Y') charset utf8 default 'N' not null,
Event_priv enum ('N', 'Y') charset utf8 default 'N' not null,
Trigger_priv enum ('N', 'Y') charset utf8 default 'N' not null,
Create_tablespace_priv enum ('N', 'Y') charset utf8 default 'N' not null,
ssl_type enum ('', 'ANY', 'X509', 'SPECIFIED') charset utf8 default '' not null,
ssl_cipher blob not null,
x509_issuer blob not null,
x509_subject blob not null,
max_questions int(11) unsigned default 0 not null,
max_updates int(11) unsigned default 0 not null,
max_connections int(11) unsigned default 0 not null,
max_user_connections int(11) unsigned default 0 not null,
plugin char(64) default 'caching_sha2_password' not null,
authentication_string text null,
password_expired enum ('N', 'Y') charset utf8 default 'N' not null,
password_last_changed timestamp null,
password_lifetime smallint unsigned null,
account_locked enum ('N', 'Y') charset utf8 default 'N' not null,
Create_role_priv enum ('N', 'Y') charset utf8 default 'N' not null,
Drop_role_priv enum ('N', 'Y') charset utf8 default 'N' not null,
Password_reuse_history smallint unsigned null,
Password_reuse_time smallint unsigned null,
Password_require_current enum ('N', 'Y') charset utf8 null,
User_attributes json null,
primary key (Host, User)
)
comment 'Users and global privileges' collate = utf8_bin;
grant select on table user to 'mysql.session'@localhost;
对我们来说比较重要的几个是select、insert、update、delete、alter、drop、create、all/all privileges
3.1 查询权限
查询指定用户权限语法如下:
show grants for '用户名'@'主机名'
案例1:查询root用户的权限
show grants for 'root'@'localhost'
3.2 授予权限
授予指定用户指定权限语法如下:
grant 权限列表 on 数据库名.表名 to '用户名'@'表名'
案例1:授权liziba用户所有数据库所有表的查询权限
第一步先查询liziba用户的权限
show grants for 'liziba'@'localhost';
可以发现liziba用户有一个usage权限,注意这个权限是MySQL在创建用户时给每个用户分配的最低权限,这个权限几乎干不了啥事情,并且无法被回收,只能连接到数据库和查询information_schema。
这个可以通过cmd直接使用liziba用户连接到MySQL就可以验证
紧接着给liziba用户授权
grant select on *.* to 'liziba'@'localhost';
此时发现liziba用户拥有了每个数据库的select权限,.代表任意数据库的任意表。
授权之后,再次执行select语句查询,发现liziba用户拥有了select权限:
赋予某个用户全部权限可以使用如下语句:
grant all on *.* to '用户名'@'主机名'
3.3 撤销权限
撤销指定用户指定权限语法如下:
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';
案例1:撤销liziba用户的全部权限
revoke all on *.* from 'liziba'@'localhost';
以上是关于MySQL之DCL(Data Control Language)的主要内容,如果未能解决你的问题,请参考以下文章
MySQL之DCL(Data Control Language)
MySQL之DCL(Data Control Language)
Data Control Language(DCL):数据控制语言
SQL Fundamentals || DCL(Data Control Language) || 角色ROLES
SQL Fundamentals || DCL(Data Control Language) || 用户管理&Profile概要文件