MySQL 權限系統基於權限表驗證與授權。本文系統梳理 `user`/`db`/`tables_priv`/`columns_priv`/`procs_priv`/`proxies_priv` 六大權限表存取邏輯,詳細列舉 27 項權限的授予語法、生效範圍、典型操作與安全建議,並說明全域權限與物件級權限的層級遞補機制。
層級遞補規則: `user` (全域 Y → 直接通過,不再檢查下層) → `db` (庫級 Y) → `tables_priv` (表級 Y) → `columns_priv` (欄位級 Y)。任何層級為 Y 即授權成功,N 則繼續向下檢查。
| # | 權限 | 允許操作 | 授予語法範例 | 備註 |
|---|---|---|---|---|
| 1 | USAGE | 僅連線登入 (無操作權) | GRANT USAGE ON *.* TO 'u'@'h' IDENTIFIED BY 'p'; | 建立用戶自動授予,**不可 REVOKE** (不刪除用戶) |
| 2 | SELECT | 查詢 | GRANT SELECT ON db.* TO 'u'@'h'; | |
| 3 | CREATE | 建表/索引 | GRANT CREATE ON db.* TO 'u'@'h'; | |
| 4 | CREATE ROUTINE | 建立/修改/刪除 PROCEDURE/FUNCTION | GRANT CREATE ROUTINE ON db.* TO 'u'@'h'; | **自動附贈** EXECUTE, ALTER ROUTINE 給建立者 |
| 5 | CREATE TEMPORARY TABLES | 建立臨時表 | GRANT CREATE TEMPORARY TABLES ON db.* TO 'u'@'h'; | 注意複數 TABLES |
| 6 | CREATE VIEW | 建立視圖 | GRANT CREATE VIEW ON db.* TO 'u'@'h'; | |
| 7 | CREATE USER | 建立/刪除/重命名用戶 | GRANT CREATE USER ON *.* TO 'u'@'h'; | **僅全域** 或需 INSERT 權限於 mysql.user |
| 8 | INSERT | 插入資料 | GRANT INSERT ON db.* TO 'u'@'h'; | |
| 9 | ALTER | 修改表結構 | GRANT ALTER ON db.* TO 'u'@'h'; | |
| 10 | ALTER ROUTINE | 修改/刪除程序/函數 | GRANT ALTER ROUTINE ON db.* TO 'u'@'h'; | 撤銷後無法 DROP PROCEDURE |
| 11 | UPDATE | 更新資料 | GRANT UPDATE ON db.* TO 'u'@'h'; | |
| 12 | DELETE | 刪除資料 | GRANT DELETE ON db.* TO 'u'@'h'; | |
| 13 | DROP | 刪除庫/表/視圖/索引 | GRANT DROP ON db.* TO 'u'@'h'; | |
| 14 | SHOW DATABASES | 查看所有庫 (含無權限者) | GRANT SHOW DATABASES ON *.* TO 'u'@'h'; | **僅全域** |
| 15 | SHOW VIEW | SHOW CREATE VIEW | GRANT SHOW VIEW ON db.* TO 'u'@'h'; | |
| 16 | INDEX | 建立/刪除索引 | GRANT INDEX ON db.* TO 'u'@'h'; | |
| 17 | EXECUTE | 呼叫程序/函數 | GRANT EXECUTE ON PROCEDURE db.p TO 'u'@'h'; | 可指定具體程序 |
| 18 | LOCK TABLES | 鎖表 (需 SELECT 權限) | GRANT LOCK TABLES ON db.* TO 'u'@'h'; | |
| 19 | REFERENCES | 建立外鍵引用 | GRANT REFERENCES ON db.* TO 'u'@'h'; | |
| 20 | RELOAD | FLUSH TABLES/LOGS/PRIVILEGES | GRANT RELOAD ON *.* TO 'u'@'h'; | **僅全域** |
| 21 | REPLICATION CLIENT | SHOW MASTER/SLAVE STATUS | GRANT REPLICATION CLIENT ON *.* TO 'u'@'h'; | **僅全域** |
| 22 | REPLICATION SLAVE | 從庫讀取 Binlog | GRANT REPLICATION SLAVE ON *.* TO 'u'@'h'; | **僅全域** |
| 23 | SHUTDOWN | mysqladmin shutdown | GRANT SHUTDOWN ON *.* TO 'u'@'h'; | **僅全域** |
| 24 | GRANT OPTION | 將自己擁有的權限授予他人 | GRANT GRANT OPTION ON db.* TO 'u'@'h'; | 僅限已擁有權限 |
| 25 | FILE | SELECT ... INTO OUTFILE / LOAD DATA INFILE | GRANT FILE ON *.* TO 'u'@'h'; | **僅全域**,**極高風險** (讀寫伺服器檔案),嚴禁授予非管理員 |
| 26 | SUPER | KILL 線程、SET GLOBAL、CHANGE MASTER、PURGE BINLOG | GRANT SUPER ON *.* TO 'u'@'h'; | **僅全域**,高風險 |
| 27 | PROCESS | SHOW PROCESSLIST (全例程)、KILL | GRANT PROCESS ON *.* TO 'u'@'h'; | **僅全域**,預設用戶僅見自身進程 |
修改權限表後,執行 `FLUSH PRIVILEGES;` 或 `mysqladmin flush-privileges` 重載快取生效 (MySQL 8.0+ 部分操作自動生效)。