mysql菜鸟教程

专栏导航

17.5 删除用户

      随着人员的变动或项目的结束,我们需要从数据库中移除不再使用的用户账户。MySQL 提供了 DROP USER 语句来永久删除用户账户及其权限。本节将详细介绍如何安全地删除用户。

一、DROP USER 的基本语法

DROP USER [IF EXISTS] '用户名'@'主机名' [, '用户名2'@'主机名2'] ...;
  • 用户名和主机名:必须与创建用户时指定的完全一致(包括主机名部分)。例如,要删除本地用户 zhangsan,应使用 'zhangsan'@'localhost'

  • IF EXISTS:可选,如果用户不存在,不会报错,而是产生一个警告。这在脚本中很有用,可以避免因用户不存在而中断执行。

  • 可以一次删除多个用户,用逗号分隔。

示例

删除单个用户:

DROP USER 'zhangsan'@'localhost';

如果用户不存在时不报错:

DROP USER IF EXISTS 'lisi'@'%';

同时删除多个用户:

DROP USER 'wangwu'@'localhost', 'zhaoliu'@'192.168.1.%';

二、删除用户时会发生什么?

  • 权限自动回收:用户的所有权限(全局、数据库、表等)会被一并删除。

  • 当前会话的影响:如果该用户当前有已连接的会话,MySQL 5.7 及之后版本会自动终止这些会话,用户将立即无法继续操作。在旧版本中,会话可能保持活动直到结束,但之后无法重新连接。

  • 用户定义的对象:如果该用户创建了数据库、表、存储过程等对象,这些对象不会自动删除,但对象的所有者(DEFINER)仍会记录为已删除的用户名。后续对这些对象的访问可能受到影响,尤其是在执行存储过程或视图时,如果定义了 SQL SECURITY DEFINER 且用户已不存在,可能会导致错误。因此,在删除用户前应检查并处理由其拥有的对象。

三、删除用户前的准备工作

在删除用户前,建议执行以下步骤:

  1. 确认用户身份:通过 SELECT user, host FROM mysql.user; 查看用户列表,确保用户名和主机名正确。

  2. 查看用户权限:使用 SHOW GRANTS FOR 'user'@'host'; 确认权限范围,以便评估删除影响。

  3. 检查用户拥有的对象:例如,查询 information_schema 中 DEFINER 为该用户的视图、存储过程等:

SELECT ROUTINE_SCHEMA, ROUTINE_NAME
FROM information_schema.ROUTINES
WHERE DEFINER = 'user@host';

对于表,MySQL 不记录表的所有者,但可以通过文件属性等间接判断,通常不构成问题。

转移或重定义对象:如果有必要,可以将对象的所有者改为其他用户(例如,使用 ALTER DEFINER 或重建对象)。

四、不推荐的方式:直接删除系统表记录

有些旧教程可能提到直接删除 mysql.user 表中的记录:

DELETE FROM mysql.user WHERE user = 'zhangsan' AND host = 'localhost';
FLUSH PRIVILEGES;

强烈不推荐这样做,原因如下:

  • 手动删除可能遗漏其他权限表(如 dbtables_priv 等)中的相关记录,导致权限残留。

  • FLUSH PRIVILEGES 需要手动执行,且容易出错。

  • DROP USER 是一个原子操作,会自动清理所有相关的权限记录,安全可靠。

小结

命令

说明

DROP USER 'user'@'host';

删除指定用户及其权限

DROP USER IF EXISTS ...;

安全删除,用户不存在时只产生警告

一次删除多个

DROP USER 'a'@'%', 'b'@'localhost';

注意事项

  • 必须指定完整的主机名。

  • 删除用户前,建议先检查其拥有的对象。

  • 使用 IF EXISTS 可提高脚本健壮性。

  • 始终使用 DROP USER 而非手动删除系统表记录。


所有评论

关于我 备案号:蜀ICP备2023042032号-1