首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL DROP USER vs DELETE FROM mysql.user 差異:權限殘留風險與正確刪除姿勢

     編輯:MySQL 資料庫相關知識

核心差異

操作mysql.user 表mysql.db / tables_priv / columns_priv 等權限表FLUSH PRIVILEGES
DROP USER 'user'@'host';刪除行**級聯刪除**所有關聯權限記錄隱式執行
DELETE FROM mysql.user WHERE User='user';刪除行**不動**權限表,殘留 db/table/column 級權限需手動執行

實戰驗證

-- 1. 建用戶並授權
GRANT ALL ON test.* TO 'test'@'%' IDENTIFIED BY 'test';

-- 2. 只刪 user 表
DELETE FROM mysql.user WHERE User='test';
FLUSH PRIVILEGES;

-- 3. 檢查 db 表 —— 權限仍在!
SELECT * FROM mysql.db WHERE User='test';
+------+------+------+-------------+...
| Host | Db   | User | Select_priv |...
+------+------+------+-------------+...
| %    | test | test | Y           |...

-- 4. 重建同名低權限用戶
GRANT SELECT ON test.* TO 'test'@'%' IDENTIFIED BY 'test';
-- 發現 db 表權限**未變**,仍為 ALL PRIVILEGES!

根因

MySQL 權限系統為**多表授權模型**,DROP USER 會遍歷所有權限表清理,而 DELETE 只操作單表。

正確姿勢

  1. **永遠使用 DROP USER** 刪除賬戶。
  2. 若誤用 DELETE,必須手動清理:
DELETE FROM mysql.db WHERE User='test';
DELETE FROM mysql.tables_priv WHERE User='test';
DELETE FROM mysql.columns_priv WHERE User='test';
DELETE FROM mysql.procs_priv WHERE User='test';
FLUSH PRIVILEGES;

最佳實踐

  • 腳本化用戶生命週期管理,統一用 CREATE USER/DROP USER/GRANT/REVOKE。
  • 定期審計 mysql.db 等權限表,排查孤兒權限(User 不在 mysql.user 中)。
  • MySQL 8.0+ 可用 SHOW CREATE USER 導出定義,版本控制管理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved