数据库中的DCL

一、什么是 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 外的所有权限

九、注意事项

  1. 权限控制越细越好 :通常不给普通用户 DROPDELETE 等危险权限。

  2. 主机名限制'user'@'localhost' 只能本机访问,更安全;'user'@'%' 允许任何 IP 访问,需谨慎。

  3. 权限生效时机GRANT/REVOKE 执行后立即生效,但如果是修改了全局权限(*.*),可能需要 FLUSH PRIVILEGES 或新连接才生效。

  4. 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 ...

相关推荐
星辰_mya2 小时前
【无标题】
数据库·后端·面试·架构师
Yvonne爱编码2 小时前
数据库---Day6 数据库约束
数据库
空太Jun2 小时前
Spring Security 自定义数据库认证(初尝试)
java·数据库·spring
sinat_255487813 小时前
泛型·学习笔记
java·jvm·数据库·windows·python
wregjru3 小时前
【MySQL】4. 数据约束详解
数据库·sql·oracle
枕书3 小时前
Oracle 19c RAC 双机高可用底座部署手册(PVE 架构版)
数据库·oracle·pve
一个有温度的技术博主3 小时前
Redis RDB持久化原理:一次快照背后的“分身术”与“读心术”
数据库·redis·缓存
小孤月3 小时前
关系型数据库:(eg:mysql)支持事务 ACID 特性
数据库