MySQL 用戶管理可透過 GRANT 指令(推薦)或直接操作 mysql.user 等授權表完成。本文詳細說明兩種方式的語法、範例與注意事項,助您精準控管資料庫存取權限。
GRANT 語法簡潔、自動處理權限刷新、不易出錯,支援主機通配符、密碼設定、權限層級(全域、資料庫、表、欄位)。
GRANT privileges ON database.table TO 'user'@'host' [IDENTIFIED BY 'password'] [WITH GRANT OPTION];
-- 1. 建立超級用戶 monty,允許本機與遠端連線,密碼 something,可授權他人
GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost' IDENTIFIED BY 'something' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%' IDENTIFIED BY 'something' WITH GRANT OPTION;
-- 2. 建立管理用戶 admin,僅本機、無密碼,擁有 RELOAD、PROCESS 權限
GRANT RELOAD, PROCESS ON *.* TO 'admin'@'localhost';
-- 3. 建立無權限用戶 dummy,僅能連線
GRANT USAGE ON *.* TO 'dummy'@'localhost';
Host,若僅授權 %,本機連線可能被 localhost 匿名用戶攔截導致拒絕。GRANT 具體權限。CREATE USER ... IDENTIFIED BY ... 再 GRANT,分離認證與授權。透過 INSERT/UPDATE 修改 mysql.user、mysql.db、mysql.tables_priv 等表,最後必須執行 FLUSH PRIVILEGES 重讀生效。
-- 超級用戶 monty(localhost 與 % 兩筆)
INSERT INTO mysql.user VALUES ('localhost','monty',PASSWORD('something'), 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
INSERT INTO mysql.user VALUES ('%','monty',PASSWORD('something'), 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
-- 管理用戶 admin
INSERT INTO mysql.user SET Host='localhost', User='admin', Reload_priv='Y', Process_priv='Y';
-- 無權限用戶 dummy
INSERT INTO mysql.user (Host, User, Password) VALUES ('localhost','dummy','');
FLUSH PRIVILEGES;
| 欄位 | 權限 | 範圍 |
|---|---|---|
| Select_priv | SELECT | 全域/庫/表 |
| Insert_priv | INSERT | 全域/庫/表 |
| Update_priv | UPDATE | 全域/庫/表 |
| Delete_priv | DELETE | 全域/庫/表 |
| Create_priv | CREATE | 全域/庫/表 |
| Drop_priv | DROP | 全域/庫/表 |
| Reload_priv | FLUSH/RELOAD | 伺服器管理 |
| Shutdown_priv | SHUTDOWN | 伺服器管理 |
| Process_priv | PROCESS | 伺服器管理 |
| File_priv | FILE | 伺服器檔案 |
| Grant_priv | GRANT OPTION | 全域/庫/表 |
| References_priv | REFERENCES | 全域/庫/表 |
| Index_priv | INDEX | 全域/庫/表 |
| Alter_priv | ALTER | 全域/庫/表 |