数据控制语言 DCL

简介: 本篇文章详细介绍了 MySQL 中 DCL(数据控制语言)的核心命令,包括用户账户的创建、修改、删除 (CREATE USER, ALTER USER, DROP USER),以及数据库权限的授予与撤销 (GRANT, REVOKE)。文章通过清晰语法和实际示例,指导读者如何设置强密码、限制登录主机、精细授权数据库对象,帮助构建更安全可控的数据库系统。结合最佳实践与练习题,本教程适合 DBA 入门者和开发人员快速掌握 MySQL 权限管理能力。

作者:IvanCodes
日期:2025年6月7日

核心目标: 学习如何管理 MySQL 用户账户及其对数据库对象的访问权限,确保数据库安全。

主要命令: CREATE USER, ALTER USER, DROP USER, GRANT, REVOKE.

前提: DCL 操作通常需要具有相应管理权限的用户(如 root 用户或拥有 CREATE USERGRANT 等权限的用户)来执行。

1. 用户管理

创建用户 (create user)
作用:创建新的 MySQL 用户账户。
语法:

create user 'username'@'host' identified by 'password';

说明:

  • 'username': 要创建的用户名。
  • 'host': 指定用户可以从哪个主机连接 ('localhost', '%', 特定 IP)。
  • identified by 'password': 设置用户的登录密码。务必使用强密码!

示例:

-- 创建一个只能本地登录,密码为 'pass123' 的用户 'appuser'
create user 'appuser'@'localhost' identified by 'pass123';

-- 创建一个可以从任何地方登录,密码为 'complex_Pwd!@#' 的用户 'remote_admin'
create user 'remote_admin'@'%' identified by 'complex_Pwd!@#';

-- 创建一个只能从特定 IP 登录的用户
create user 'report_user'@'192.168.1.50' identified by 'report_secret';

查看用户
作用:列出 MySQL 中的用户账户。
语法 (查询系统表):

select user, host from mysql.user;

修改用户 (alter user)
作用:修改现有用户的属性,最常用的是修改密码。
语法 (修改密码 - 推荐方式):

alter user 'username'@'host' identified by 'new_password';

语法 (其他修改 - 不常用):

-- rename user 'olduser'@'oldhost' to 'newuser'@'newhost'; -- 重命名
-- alter user 'username'@'host' account lock; -- 锁定
-- alter user 'username'@'host' account unlock; -- 解锁

示例:

-- 修改 'appuser'@'localhost' 的密码为 'newStrongPass456'
alter user 'appuser'@'localhost' identified by 'newStrongPass456';

删除用户 (drop user)
作用:永久删除一个用户账户。
语法:

drop user 'username'@'host';

!!! 警告:删除用户是不可逆的 !!!

示例:

-- 删除本地用户 'testuser'
drop user 'testuser'@'localhost';

-- 删除远程用户 'old_admin'
drop user 'old_admin'@'%';

2. 权限管理

权限 (Privileges) 概念:
定义用户能在数据库上执行的操作。常见权限:select, insert, update, delete, create, drop, alter, all privileges 等。权限作用域:全局 (*.*), 数据库 (database_name.*), 表 (database_name.table_name)。

授予权限 (grant)
作用:给用户分配操作数据库对象的权限。
语法:

grant privilege_list on object_type to 'username'@'host' [with grant option];

说明:

  • privilege_list: 权限列表 (如 select, insert) 或 all privileges
  • object_type: 权限作用的对象 (如 db_name.*, db_name.table_name, *.*)。
  • with grant option: (可选) 允许该用户将权限授予他人(危险)。

示例:

-- 授予 'appuser'@'localhost' 对 'company_db' 所有表的 select, insert, update 权限
grant select, insert, update on company_db.* to 'appuser'@'localhost';

-- 授予 'report_user'@'192.168.1.50' 对 'sales_db.orders' 表的只读权限
grant select on sales_db.orders to 'report_user'@'192.168.1.50';

-- 授予 'db_admin'@'localhost' 对 'inventory_db' 的所有权限并允许授权
grant all privileges on inventory_db.* to 'db_admin'@'localhost' with grant option;

-- 授予创建数据库的全局权限 (谨慎)
grant create on *.* to 'developer'@'localhost';

查看权限 (show grants)
作用:显示指定用户拥有的权限。
语法:

show grants for 'username'@'host';

示例:

-- 查看 'appuser'@'localhost' 的权限
show grants for 'appuser'@'localhost';

-- 查看当前登录用户的权限
show grants;
-- 或者
-- show grants for current_user();

撤销权限 (revoke)
作用:收回已授予用户的权限。
语法:

revoke privilege_list on object_type from 'username'@'host';

注意:privilege_listobject_type 需与 grant 时匹配。撤销 grant option 使用 revoke grant option on ... from ...

示例:

-- 从 'appuser'@'localhost' 收回对 'company_db' 的 update 权限
revoke update on company_db.* from 'appuser'@'localhost';

-- 从 'report_user'@'192.168.1.50' 收回对 'sales_db.orders' 的 select 权限
revoke select on sales_db.orders from 'report_user'@'192.168.1.50';

-- 撤销 'db_admin'@'localhost' 对 'inventory_db' 的所有权限
revoke all privileges on inventory_db.* from 'db_admin'@'localhost';

-- 撤销 'db_admin'@'localhost' 的授权能力
revoke grant option on inventory_db.* from 'db_admin'@'localhost';

3. 重要说明与最佳实践

  • flush privileges;: 通常不需要手动执行。仅在直接修改系统权限表(不推荐)后才需要。标准 DCL 命令会自动刷新权限。
  • 最小权限原则: 只授予必需的最小权限。
  • 应用程序用户: 为应用创建独立用户,精确授权。
  • 强密码策略: 使用复杂密码。
  • 定期审查: 定期检查用户和权限。

练习题 (Practice Exercises - DCL with Answers)

假设你以 root 用户或其他有足够权限的用户登录。

  1. 创建一个新用户 readonly_user,只能从本地 (localhost) 登录,密码设置为 ReadOnly123
    答案:

    create user 'readonly_user'@'localhost' identified by 'ReadOnly123';
    
  2. 授予 readonly_user 对数据库 mydatabase 中所有表的只读权限 (select)。
    答案:

    grant select on mydatabase.* to 'readonly_user'@'localhost';
    
  3. 查看 readonly_user 现在拥有的权限。
    答案:

    show grants for 'readonly_user'@'localhost';
    
  4. 创建一个新用户 webapp,可以从任何主机 (%) 登录,密码为 WebAppSecurePwd!.
    答案:

    create user 'webapp'@'%' identified by 'WebAppSecurePwd!';
    
  5. 授予 webapp 用户对 mydatabase 数据库中的 users 表和 orders 表执行 select, insert, update 操作的权限。
    答案:

    grant select, insert, update on mydatabase.users to 'webapp'@'%';
    grant select, insert, update on mydatabase.orders to 'webapp'@'%';
    
  6. 修改 readonly_user 的密码为 NewPass456
    答案:

    alter user 'readonly_user'@'localhost' identified by 'NewPass456';
    
  7. 撤销 webapp 用户对 mydatabase.users 表的 update 权限。
    答案:

    revoke update on mydatabase.users from 'webapp'@'%';
    
  8. 查看 webapp 用户现在的权限,确认 update on users 已被撤销。
    答案:

    show grants for 'webapp'@'%';
    
  9. 删除用户 readonly_user
    答案:

    drop user 'readonly_user'@'localhost';
    
目录
相关文章
|
JavaScript 前端开发
JavaScriptDOM操作:怎样获取或修改一个元素的样式?
JavaScriptDOM操作:怎样获取或修改一个元素的样式?
940 0
|
SQL 数据库 Windows
若依代码生成详细教程
我觉得若依官方的代码生成教程过于简单,网上的教程很多连个效果图都没有。 本文要达到的效果如下:[学生管理] 下有个 [学生信息] 菜单,里面可以增删改查。
7252 0
若依代码生成详细教程
|
缓存 前端开发 JavaScript
Vue项目打包部署Nginx配置及前端缓存问题解决
Vue项目打包部署Nginx配置及前端缓存问题解决
2522 0
Vue项目打包部署Nginx配置及前端缓存问题解决
|
10月前
|
NoSQL Linux MongoDB
申威ky10架构安装MongoDB 4.0.1(rpm包:mongodb-4.0.1-8.ky10.sw_64.rpm)详细步骤
本文介绍在申威ky10架构、CentOS/RedHat系系统(如麒麟V10)上安装MongoDB 4.0.1的方法,包括环境确认、下载rpm包、依赖安装、使用rpm命令安装、服务启动与验证步骤,确保用户顺利完成部署并验证数据库运行正常。
1129 3
|
10月前
|
JavaScript 搜索推荐 Java
基于springboot的民宿预定管理系统
本研究针对民宿市场管理效率低、信息化程度不足等问题,设计并实现基于Spring Boot、Vue和MySQL的民宿预订管理系统。系统提升预订效率与用户体验,助力行业数字化转型。
|
人工智能 自动驾驶 算法
本地生活技术雷达——生成式AI(Generative AI)在阿里本地生活的应用与思考
本地生活技术雷达是由本地生活技术中心战略管理&PMO团队开展的,定期扫描和评估新兴技术的战略研究工作。目的是对技术趋势进行前瞻性预判,提出新技术布局建议,在技术驱动业务创新和业务增长、践行社会责任等方面有一些实质性探索。 本篇尝试探讨 1)理解AI范式——从分析型(Analytical AI)到生成式(Generative AI)的拐点在2022年,其对人类社会以及商业模式的长期影响; 2)生成式AI(文生文、文生图、图生图等)在本地业务目前场景的应用和未来的方向。 欢迎技术、产品、运营、战略、管理层、国内国际等各种视角的指点和碰撞!
40459 8
|
存储 Oracle 关系型数据库
【数据库-DB2】深入了解DB2 reorg
本文介绍了DB2数据库中reorg操作的重要性,旨在通过重组表数据来消除数据碎片、压缩信息并提高数据访问速度。reorg操作能够根据索引关键字重新排序数据,减少查询I/O次数,提升查询性能。文章详细讲解了reorg的操作步骤、适用场景及注意事项,强调了在执行reorg前后更新统计信息的必要性。
1290 2
|
云安全 NoSQL 安全
【Azure Redis】关于Redis的两个安全漏洞在Azure Redis是否修复问题:CVE-2024-51741 和 CVE-2024-46981
本文探讨了两个 Redis 漏洞(CVE-2024-51741 和 CVE-2024-46981)在 Azure Redis 上是否存在安全风险。CVE-2024-51741 可能因格式错误的 ACL 触发拒绝服务,而 CVE-2024-46981 或因恶意 Lua 脚本导致远程代码执行。目前 Azure Redis 使用版本 6.0,不受上述漏洞影响,且 Azure 云服务会及时修复漏洞以确保安全。文章强调 Azure 遵循严格的安全标准,为用户提供可靠保障。
492 4
|
XML 数据格式 索引
xpath模块使用教程
XPath 是一种在 XML 文档中查找信息的语言,广泛用于 HTML 解析。本文介绍了 XPath 的安装与使用,包括 lxml 库的安装、解析流程、基本语法、路径表达式、谓语、通配符、多路径选择、逻辑运算、属性查询、索引查询、模糊查询、内容查询、属性值获取及节点内容转换等。通过实例详细说明了各种用法,帮助读者快速掌握 XPath 的应用技巧。
1155 39
|
JavaScript 算法 前端开发
为什么npm run serve正常,npm run build就报错:digital envelope routines::unsupported
通过本文的分析,我们详细介绍了 `npm run serve`正常但 `npm run build`时报错:`digital envelope routines::unsupported`的原因及解决方案。主要从检查Node.js版本、更新依赖、检查依赖库、配置文件及环境变量等方面进行了深入探讨。希望本文能帮助开发者解决这一问题,确保项目顺利构建和部署。
1780 6