MySQL GRANT 權限體系全景圖:從列級到服務器級
一、常用角色授權模板
1. 普通數據用戶(增刪改查)
GRANT SELECT, INSERT, UPDATE, DELETE ON testdb.* TO 'common_user'@'%';
2. 開發人員(結構變更、程式對象)
GRANT CREATE, ALTER, DROP, INDEX, REFERENCES ON testdb.* TO 'dev'@'192.168.0.%';
GRANT CREATE TEMPORARY TABLES ON testdb.* TO 'dev'@'192.168.0.%';
GRANT CREATE VIEW, SHOW VIEW ON testdb.* TO 'dev'@'192.168.0.%';
GRANT CREATE ROUTINE, ALTER ROUTINE, EXECUTE ON testdb.* TO 'dev'@'192.168.0.%';
3. 單庫 DBA
GRANT ALL PRIVILEGES ON testdb TO 'dba'@'localhost';
4. 超級 DBA(全庫全表)
GRANT ALL ON *.* TO 'dba'@'localhost';
二、五大作用層級
| 層級 | 語法示例 | 說明 |
| 服務器級 | GRANT SELECT ON *.* TO 'dba'@'localhost'; | 全庫所有表 |
| 數據庫級 | GRANT SELECT ON testdb.* TO 'dba'@'localhost'; | 單庫所有表 |
| 表級 | GRANT SELECT, INSERT ON testdb.orders TO 'dba'@'localhost'; | 單表指定權限 |
| 列級 | GRANT SELECT (id, name) ON testdb.users TO 'dba'@'localhost'; | 精確到欄位 |
| 程式對象級 | GRANT EXECUTE ON PROCEDURE testdb.p1 TO 'dba'@'localhost'; | 存儲過程/函數 |
三、查看與撤銷
-- 查看當前用戶
SHOW GRANTS;
-- 查看指定用戶
SHOW GRANTS FOR 'dba'@'localhost';
-- 撤銷(語法與 GRANT 同,TO 改 FROM)
REVOKE ALL ON *.* FROM 'dba'@'localhost';
四、關鍵注意事項
- 生效需重連:權限變更後,用戶必須斷開重連
- WITH GRANT OPTION:允許被授權者再授權,**生產極度慎用**
- 系統表授權:調用存儲過程報
SELECT command denied ... for table 'proc',需 GRANT SELECT ON mysql.proc TO 'user'@'%';
- 授權表結構:
user(全局)、db(庫級)、host(主機級)、tables_priv(表級)、columns_priv(列級)
五、常見報錯對照
| 報錯 | 原因 | 解決 |
| Access denied for user | 無對應權限 | 補授權對應對象 |
| SELECT command denied ... table 'proc' | 缺 mysql.proc 權限 | GRANT SELECT ON mysql.proc TO ... |
| Unknown event | DROP 不存在事件 | 加 IF EXISTS |