GRANT 是 MySQL 管理用戶權限的核心語句,支援帳號建立、密碼設定、庫/表/欄位/程序級授權、資源限制與 SSL 強制。本文系統梳理語法、實例與底層權限表機制。
GRANT priv_type [(column_list)]
ON [object_type] priv_level
TO user_specification [, user_specification] ...
[REQUIRE {NONE | ssl_option ...}]
[WITH with_option ...];
priv_type:ALL PRIVILEGES、SELECT、INSERT、UPDATE、DELETE、CREATE、DROP、GRANT OPTION、RELOAD、PROCESS、SUPER、FILE 等priv_level:*.*(全域)、db.*(庫級)、db.tbl(表級)、tbl.col(欄位級)、PROCEDURE db.proc(程序級)user_specification:'user'@'host' IDENTIFIED BY 'pass' [WITH GRANT OPTION]WITH 選項:GRANT OPTION、MAX_QUERIES_PER_HOUR n、MAX_CONNECTIONS_PER_HOUR n、MAX_USER_CONNECTIONS n、SSL、X509GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%' IDENTIFIED BY 'strongPass!' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost' IDENTIFIED BY 'strongPass!' WITH GRANT OPTION;
-- 必須同時建立 localhost 與 % 兩條,否則匿名用戶 @localhost 優先級更高導致無法登入
GRANT RELOAD, PROCESS ON *.* TO 'admin'@'localhost' IDENTIFIED BY 'adminPass!';
-- 可執行 mysqladmin reload/flush-*、SHOW PROCESSLIST,無資料存取權
GRANT USAGE ON *.* TO 'dummy'@'localhost';
-- USAGE = 無任何權限,僅建立帳號記錄
-- 僅能從 localhost 存取 bankaccount 庫
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON bankaccount.* TO 'custom'@'localhost' IDENTIFIED BY 'stupid';
-- 僅能從 whitehouse.gov 存取 expenses 庫
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON expenses.* TO 'custom'@'whitehouse.gov' IDENTIFIED BY 'stupid';
-- 從任意主機存取 customer 庫
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON customer.* TO 'custom'@'%' IDENTIFIED BY 'stupid';
MySQL 權限實際儲存在 mysql 資料庫的 user、db、tables_priv、columns_priv、procs_priv 表中。直接 INSERT 後需 FLUSH PRIVILEGES 生效。
INSERT INTO mysql.user (Host, User, authentication_string, Select_priv, Insert_priv, ...)
VALUES ('localhost', 'monty', PASSWORD('something'), 'Y', 'Y', ...);
INSERT INTO mysql.db (Host, Db, User, Select_priv, Insert_priv, ...)
VALUES ('localhost', 'bankaccount', 'custom', 'Y', 'Y', ...);
FLUSH PRIVILEGES;
注意: MySQL 5.7+ password 欄位更名為 authentication_string,PASSWORD() 函數已棄用,建議改用 GRANT 或 CREATE USER ... IDENTIFIED BY。
| 現象 | 原因 | 解決 |
|---|---|---|
| 新建用戶無法登入 | 匿名用戶 ''@'localhost' 優先級更高 | 刪除匿名用戶 DROP USER ''@'localhost'; 或建立同名 localhost 帳號 |
| GRANT 執行後權限未生效 | 未執行 FLUSH PRIVILEGES(直接操作權限表時) | GRANT 語句自動刷新,手動 INSERT 需額外 FLUSH |
| 跨主機連線被拒 | Host 欄位不匹配(IP vs 域名、% 不包含 localhost) | 同時建立 user@'%' 與 user@'localhost' |
| 密碼修改不生效 | 使用舊 PASSWORD() 函數或未刷新 | 改用 ALTER USER 'u'@'h' IDENTIFIED BY 'newpass'; |
SELECT/INSERT/UPDATE/DELETEGRANT ALL ON *.* 給非 DBA 帳號REQUIRE SSL 強制加密傳輸MAX_USER_CONNECTIONS 防止連線洩漏拖垮實例SELECT User, Host FROM mysql.user; 審計帳號清單權限管理的核心是最小權限原則與審計可追溯。熟練掌握 GRANT 語法細節、理解底層權限表關係、建立標準化帳號命名與授權模板,才能在合規與效率間取得平衡。