首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >四、数据控制语言 DCL

四、数据控制语言 DCL

作者头像
IvanCodes
发布2025-09-28 11:25:27
发布2025-09-28 11:25:27
1100
代码可运行
举报
运行总次数:0
代码可运行

作者:IvanCodes 日期:2025年4月17日 专栏:MySQL教程

文章目录
  • 1. 用户管理
  • 2. 权限管理
  • 练习题

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

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

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

1. 用户管理

创建用户 (CREATE USER) 作用: 创建新的 MySQL 用户账户。 语法:

代码语言:javascript
代码运行次数:0
运行
复制
CREATE USER 'username'@'host' IDENTIFIED BY 'password';

说明:

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

示例:

代码语言:javascript
代码运行次数:0
运行
复制
-- 创建一个只能本地登录,密码为 '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 中的用户账户。 语法 (查询系统表):

代码语言:javascript
代码运行次数:0
运行
复制
SELECT user, host FROM mysql.user;

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

代码语言:javascript
代码运行次数:0
运行
复制
ALTER USER 'username'@'host' IDENTIFIED BY 'new_password';

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

代码语言:javascript
代码运行次数:0
运行
复制
-- RENAME USER 'olduser'@'oldhost' TO 'newuser'@'newhost'; -- 重命名
-- ALTER USER 'username'@'host' ACCOUNT LOCK; -- 锁定
-- ALTER USER 'username'@'host' ACCOUNT UNLOCK; -- 解锁

示例:

代码语言:javascript
代码运行次数:0
运行
复制
-- 修改 'appuser'@'localhost' 的密码为 'newStrongPass456'
ALTER USER 'appuser'@'localhost' IDENTIFIED BY 'newStrongPass456';

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

代码语言:javascript
代码运行次数:0
运行
复制
DROP USER 'username'@'host';

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

示例:

代码语言:javascript
代码运行次数:0
运行
复制
-- 删除本地用户 'testuser'
DROP USER 'testuser'@'localhost';

-- 删除远程用户 'old_admin'
DROP USER 'old_admin'@'%';
2. 权限管理

权限概念: 定义用户能在数据库上执行的操作。常见权限:SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, ALL PRIVILEGES 等。权限作用域:全局 (*.*), 数据库 (database_name.*), 表 (database_name.table_name)。

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

代码语言:javascript
代码运行次数:0
运行
复制
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: (可选) 允许该用户将权限授予他人(危险)。

示例:

代码语言:javascript
代码运行次数:0
运行
复制
-- 授予 '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) 作用: 显示指定用户拥有的权限。 语法:

代码语言:javascript
代码运行次数:0
运行
复制
SHOW GRANTS FOR 'username'@'host';

示例:

代码语言:javascript
代码运行次数:0
运行
复制
-- 查看 'appuser'@'localhost' 的权限
SHOW GRANTS FOR 'appuser'@'localhost';

-- 查看当前登录用户的权限
SHOW GRANTS;
-- 或者
-- SHOW GRANTS FOR CURRENT_USER();

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

代码语言:javascript
代码运行次数:0
运行
复制
REVOKE privilege_list ON object_type FROM 'username'@'host';

注意: privilege_listobject_type 需与 GRANT 时匹配。撤销 GRANT OPTION 使用 REVOKE GRANT OPTION ON ... FROM ...

示例:

代码语言:javascript
代码运行次数:0
运行
复制
-- 从 '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 命令会自动刷新权限。
  • 最小权限原则: 只授予必需的最小权限。
  • 应用程序用户: 为应用创建独立用户,精确授权。
  • 强密码策略: 使用复杂密码。
  • 定期审查: 定期检查用户和权限。

练习题

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

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

代码语言:javascript
代码运行次数:0
运行
复制
CREATE USER 'readonly_user'@'localhost' IDENTIFIED BY 'ReadOnly123';

授予 readonly_user 对数据库 mydatabase 中所有表的只读权限 (SELECT)。 答案:

代码语言:javascript
代码运行次数:0
运行
复制
GRANT SELECT ON mydatabase.* TO 'readonly_user'@'localhost';

查看 readonly_user 现在拥有的权限。 答案:

代码语言:javascript
代码运行次数:0
运行
复制
SHOW GRANTS FOR 'readonly_user'@'localhost';

创建一个新用户 webapp,可以从任何主机 (%) 登录,密码为 WebAppSecurePwd!. 答案:

代码语言:javascript
代码运行次数:0
运行
复制
CREATE USER 'webapp'@'%' IDENTIFIED BY 'WebAppSecurePwd!';

授予 webapp 用户对 mydatabase 数据库中的 users 表和 orders 表执行 SELECT, INSERT, UPDATE 操作的权限。 答案:

代码语言:javascript
代码运行次数:0
运行
复制
GRANT SELECT, INSERT, UPDATE ON mydatabase.users TO 'webapp'@'%';
GRANT SELECT, INSERT, UPDATE ON mydatabase.orders TO 'webapp'@'%';

修改 readonly_user 的密码为 NewPass456答案:

代码语言:javascript
代码运行次数:0
运行
复制
ALTER USER 'readonly_user'@'localhost' IDENTIFIED BY 'NewPass456';

撤销 webapp 用户对 mydatabase.users 表的 UPDATE 权限。 答案:

代码语言:javascript
代码运行次数:0
运行
复制
REVOKE UPDATE ON mydatabase.users FROM 'webapp'@'%';

查看 webapp 用户现在的权限,确认 UPDATE on users 已被撤销。 答案:

代码语言:javascript
代码运行次数:0
运行
复制
SHOW GRANTS FOR 'webapp'@'%';

删除用户 readonly_user答案:

代码语言:javascript
代码运行次数:0
运行
复制
DROP USER 'readonly_user'@'localhost';
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-07-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1. 用户管理
  • 2. 权限管理
  • 练习题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档