数据库中的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 ...

相关推荐
cui_ruicheng5 小时前
MySQL(四):数据类型与字段设计
数据库·mysql
皮皮学姐分享-ppx6 小时前
政府绿色采购数据库(2015-2024.3)
大数据·网络·数据库·人工智能·制造
闪电悠米8 小时前
黑马点评-Redis 消息队列-03_stream_consumer_group
开发语言·数据库·redis·分布式·缓存·junit·lua
DIY源码阁8 小时前
JavaSwing航班订票管理系统 - MySQL版
数据库·mysql
浪客灿心10 小时前
项目篇:模块设计与实现
数据库·c++
流星白龙11 小时前
【MySQL高阶】26.事务(1)
数据库·mysql
三十..12 小时前
Redis 核心原理与高可用架构实践
运维·数据库·redis
这个DBA有点耶12 小时前
索引优化深潜(下):索引合并、ICP 与索引设计的实战法则
数据库·mysql·架构
努力努力再努力wz12 小时前
【内存管理与高并发内存池系列】从 mmap 到 malloc:文件映射、匿名映射与 glibc 内存分配机制详解
linux·c语言·数据结构·数据库·c++·qt·链表
JdSnE27zv12 小时前
Qt 操作SQLite数据库
数据库·qt·sqlite