MySQL 採用 「主機 + 使用者」 雙重識別:user@host 視為唯一主體。同名使用者從不同主機連線,權限完全獨立。授權資訊儲於 mysql 系統資料庫四張核心表:
| 表名 | 層級 | 內容 |
|---|---|---|
user | 全域 | 可連線的使用者與全域權限 (管理權限、適用所有資料庫) |
db | 資料庫 | 特定資料庫的權限 |
tables_priv | 資料表 | 特定資料表的權限 |
columns_priv | 欄位 | 特定欄位的權限 |
host 表維護「安全主機清單」,不受 GRANT/REVOKE 直接影響。
user 表:找到第一筆符合 Host、User 的記錄 → 取得 全域權限基礎集 (Priv)。db 表:找到符合 Host、Db、User 的記錄 → 取得 資料庫層級權限。db 表中 Host 為空,且 user 表的 Host 存在於 host 表中,則可獲得 host 表中為 'Y' 的權限。tables_priv、columns_priv 疊加細粒度權限。非自然順序,而是依 具體 > 通配 > 空值 排序:
user 表:先比 Host (無通配 > 有通配 > 空),再比 User (同規則)。db、host 表:依 Host 欄位同規則排序。範例:localhost/root 優先於 %/root 優先於 localhost/ (匿名)。
GRANT privileges [(columns)] ON what TO user@host IDENTIFIED BY 'password' [WITH GRANT OPTION]
| 分類 | 權限關鍵字 | 說明 |
|---|---|---|
| 資料操作 (庫/表/欄) | SELECT | 查詢 |
| INSERT | 新增 | |
| UPDATE | 修改 | |
| DELETE | 刪除 | |
| CREATE | 建立庫/表 | |
| DROP | 刪除庫/表 | |
| INDEX | 索引管理 | |
| ALTER | 修改表結構 | |
管理權限 (僅全域 ON *.*) | FILE | 讀寫伺服器檔案 |
| PROCESS | 檢視/殺死執行緒 | |
| RELOAD | 重載權限/清空快取 | |
| SHUTDOWN | 關閉伺服器 | |
| REPLICATION SLAVE | 複寫從庫權限 | |
| 特殊 | ALL [PRIVILEGES] | 所有權限 |
| 特殊 | USAGE | 無權限 (僅建立帳號) |
IDENTIFIED BY 'pwd':GRANT 會自動加密,勿自行用 PASSWORD()。WITH GRANT OPTION:允許該使用者將自己擁有的權限授予他人。columns:指定欄位級權限,如 GRANT UPDATE (col1, col2) ON db.tbl TO ...。-- 超級管理員 (僅本機)
GRANT ALL ON *.* TO 'admin'@'localhost' IDENTIFIED BY 'secret' WITH GRANT OPTION;
-- 開發人員 (特定庫,全權限)
GRANT ALL ON dev_db.* TO 'dev'@'192.168.1.%' IDENTIFIED BY 'devpass';
-- 唯讀帳號 (任何主機)
GRANT SELECT ON prod_db.* TO 'readonly'@'%' IDENTIFIED BY 'ropass';
-- 欄位級權限 (薪資欄位僅 HR 可改)
GRANT UPDATE (salary) ON hr.employees TO 'hr_user'@'localhost' IDENTIFIED BY 'hrpass';
-- 僅授管理權限 (清理日誌腳本用)
GRANT RELOAD ON *.* TO 'flusher'@'localhost' IDENTIFIED BY 'flushpass';
REVOKE ALL ON *.* FROM 'user'@'host';
DELETE FROM mysql.user WHERE User='user' AND Host='host';
FLUSH PRIVILEGES;
FLUSH PRIVILEGES 或 mysqladmin reload 生效。user 表中以 PASSWORD() 加密儲存,明文無效。Host 範圍,避免使用 %。