MySQL GRANT 是資料庫安全的第一道防線。本文系統整理從實例級、庫級、表級、欄位級、存儲程序級五個維度的授權語法,並針對開發、DBA、唯讀、寫入等常見角色提供開箱即用的授權模板,助你構建最小權限原則的安全體系。
GRANT 權限列表 ON 物件 TO '用戶'@'主機' [WITH GRANT OPTION];
WITH GRANT OPTION:允許受授權者再授權給他人,慎用% 表示任意 IP,localhost 僅本機,192.168.0.% 為網段-- 唯讀帳號
GRANT SELECT ON *.* TO 'readonly'@'%';
-- DBA 全權限
GRANT ALL PRIVILEGES ON *.* TO 'dba'@'localhost' WITH GRANT OPTION;
-- 開發庫讀寫
GRANT SELECT, INSERT, UPDATE, DELETE ON `dev_db`.* TO 'dev'@'192.168.0.%';
-- 唯讀報表帳號
GRANT SELECT ON `report_db`.* TO 'reporter'@'%';
-- 業務表增刪改查
GRANT SELECT, INSERT, UPDATE, DELETE ON `biz_db`.`orders` TO 'app_user'@'%';
-- 僅開放必要欄位,隱藏敏感欄位(如密碼雜湊、薪資)
GRANT SELECT (`id`, `username`, `email`) ON `user_db`.`users` TO 'api_user'@'%';
GRANT EXECUTE ON PROCEDURE `biz_db`.`sp_calc_bonus` TO 'hr_user'@'%';
GRANT EXECUTE ON FUNCTION `biz_db`.`fn_tax` TO 'hr_user'@'%';
| 角色 | 建議授權 | 範例 |
|---|---|---|
| 開發人員 | 建表、索引、視圖、存儲程序、觸發器 | GRANT CREATE, ALTER, DROP, INDEX, CREATE VIEW, CREATE ROUTINE, ALTER ROUTINE, EXECUTE ON `dev_db`.* TO 'dev'@'%'; |
| 只讀分析師 | SELECT、SHOW VIEW | GRANT SELECT, SHOW VIEW ON `dw_db`.* TO 'analyst'@'%'; |
| 應用帳號 | CRUD、EXECUTE | GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `app_db`.* TO 'app'@'%'; |
| 備份帳號 | SELECT、LOCK TABLES、RELOAD、REPLICATION CLIENT | GRANT SELECT, LOCK TABLES, RELOAD, REPLICATION CLIENT ON *.* TO 'backup'@'backup_host'; |
-- 回收權限
REVOKE INSERT ON `testdb`.* FROM 'common_user'@'%';
-- 查看使用者權限
SHOW GRANTS FOR 'dev'@'%';
-- 查看所有使用者
SELECT User, Host FROM mysql.user;
FLUSH PRIVILEGES;(MySQL 8.0+ 通常自動生效)'user'@'%' 不包含 localhost,需單獨授權CREATE USER ... IDENTIFIED BY ... 設定強密碼SHOW GRANTS 掃描,清理僵屍帳號遵循「最小權限、按角色分組、定期審計」三原則,MySQL 權限管理即能兼顧安全與效率。