一、什么是 DCL?
DCL 全称 Data Control Language ,用于管理数据库用户的权限:给谁授予什么权限,或者收回谁的权限。
简单说就是:谁能做什么,谁不能做什么。
二、DCL 的两个核心命令
| 命令 | 作用 |
| GRANT | 授予权限 |
REVOKE |
收回权限 |
|---|
三、基础概念:用户和权限
-
用户 :连接数据库的账号(如
'zhangsan'@'localhost')。 -
权限 :允许执行的操作,比如
SELECT(查)、INSERT(增)、UPDATE(改)、DELETE(删)、CREATE(建表)、DROP(删表)等。
四、GRANT 语法(授予权限)
sql
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
-
权限列表 :多个权限用逗号分隔,如
SELECT, INSERT, UPDATE。也可以用ALL PRIVILEGES表示所有权限。 -
数据库名.表名 :
*.*表示所有数据库的所有表;testdb.*表示 testdb 数据库下的所有表。 -
'用户名'@'主机名' :
'zhangsan'@'localhost'表示只允许从本机连接;'lisi'@'%'表示允许从任何主机连接
例子 1:创建一个用户并授予只读权限
sql
-- 先创建用户(如果不存在)
CREATE USER 'reader'@'localhost' IDENTIFIED BY 'password123';
-- 授予对 testdb 数据库所有表的 SELECT 权限
GRANT SELECT ON testdb.* TO 'reader'@'localhost';
例子 2:授予某用户对某张表的所有权限
sql
GRANT ALL PRIVILEGES ON testdb.orders TO 'admin'@'%';
例子 3:授予多个权限
sql
GRANT SELECT, INSERT, UPDATE ON testdb.users TO 'editor'@'192.168.1.%';
五、REVOKE 语法(收回权限)
sql
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
例子:收回之前授予的 INSERT 权限
sql
REVOKE INSERT ON testdb.users FROM 'editor'@'192.168.1.%';
六、查看和刷新权限
-
查看某用户的权限:
sql
SHOW GRANTS FOR 'reader'@'localhost'; -
刷新权限(修改权限后建议执行,但 GRANT/REVOKE 通常会自动生效):
sql
FLUSH PRIVILEGES;
七、一个完整的小案例
场景 :有一个数据库 company,需要创建一个新用户 hr,只能从本机连接,只能查询 employees 表,不能修改数据。
sql
-- 1. 创建用户(密码设为 'hr123')
CREATE USER 'hr'@'localhost' IDENTIFIED BY 'hr123';
-- 2. 授予 SELECT 权限
GRANT SELECT ON company.employees TO 'hr'@'localhost';
-- 3. 验证权限(用 hr 用户登录后尝试)
-- SELECT * FROM company.employees; ✅ 成功
-- INSERT INTO company.employees ... ❌ 失败,没有权限
-- 4. 后来老板说 hr 也需要能插入新员工,则追加权限
GRANT INSERT ON company.employees TO 'hr'@'localhost';
-- 5. 再后来 hr 离职了,收回所有权限
REVOKE ALL PRIVILEGES ON company.employees FROM 'hr'@'localhost';
-- 6. 甚至可以删除用户
DROP USER 'hr'@'localhost';
八、常见权限列表(部分)
| 权限 | 说明 |
|---|---|
SELECT |
查询数据 |
INSERT |
插入数据 |
UPDATE |
修改数据 |
DELETE |
删除数据 |
CREATE |
创建表/数据库 |
DROP |
删除表/数据库 |
INDEX |
创建/删除索引 |
ALTER |
修改表结构 |
ALL PRIVILEGES |
除 GRANT OPTION 外的所有权限 |
九、注意事项
-
权限控制越细越好 :通常不给普通用户
DROP、DELETE等危险权限。 -
主机名限制 :
'user'@'localhost'只能本机访问,更安全;'user'@'%'允许任何 IP 访问,需谨慎。 -
权限生效时机 :
GRANT/REVOKE执行后立即生效,但如果是修改了全局权限(*.*),可能需要FLUSH PRIVILEGES或新连接才生效。 -
WITH GRANT OPTION:允许用户把自己拥有的权限再授予别人(一般不轻易给)。
mysql中


你可以把这个 mysql 数据库看作是整个数据库系统的"管家"。
1. 用户信息存在哪张表?
在 mysql 数据库中,最核心的一张表叫做 user。 如果你执行以下命令,就能看到当前系统中所有的用户信息:
SQL
-- 切换到系统数据库
USE mysql;
-- 查看用户、主机和加密后的密码
SELECT user, host, authentication_string FROM user;
2. user 表里都有什么?
这张表不仅仅存了名字,它还决定了谁能进来,以及进来后能干什么:
-
user: 用户名。 -
host: 允许连接的主机地址。在 MySQL 中,'root'@'localhost'和'root'@'192.168.1.10'是两个完全不同的账号。 -
authentication_string: 经过加密后的密码。 -
权限列 : 表中还有大量的字段(如
Select_priv,Insert_priv等),用来记录该用户是否拥有全局性质的操作权限。
3. 为什么要注意这个数据库?
-
安全性 :绝不要轻易修改
mysql.user表里的数据。如果你手动用UPDATE语句改了密码或权限,MySQL 往往不会立即生效,除非你执行FLUSH PRIVILEGES;。 -
推荐做法:虽然我们可以直接操作这张表,但为了安全和规范,建议使用标准的 SQL 命令来管理:
-
创建用户:
CREATE USER ... -
修改密码:
ALTER USER ... -
分配权限:
GRANT ...
-