MySQL 權限系統採用 GRANT / REVOKE,支援全域、庫、表、欄、程序六個層級。本文整理最常用授權模板。
GRANT 權限列表 ON 物件 TO '用戶'@'主機' [IDENTIFIED BY '密碼'] [WITH GRANT OPTION];
| 層級 | 語法範例 | 說明 |
|---|---|---|
| 全域 | GRANT SELECT ON *.* TO 'readonly'@'%'; | 所有庫所有表 |
| 單庫 | GRANT SELECT, INSERT, UPDATE, DELETE ON testdb.* TO 'app'@'%'; | 常見應用帳號 |
| 單表 | GRANT SELECT, INSERT ON testdb.orders TO 'etl'@'10.0.0.%'; | ETL 專用 |
| 單欄 | GRANT SELECT(id, name, email) ON testdb.users TO 'api'@'%'; | 敏感欄位隔離 |
| 存儲過程/函數 | GRANT EXECUTE ON PROCEDURE testdb.p_calc TO 'app'@'%'; | 僅授權執行 |
-- 開發人員:建表、索引、視圖、程序
GRANT CREATE, ALTER, DROP, INDEX, CREATE VIEW, SHOW VIEW,
CREATE ROUTINE, ALTER ROUTINE, EXECUTE
ON dev_db.* TO 'dev'@'192.168.0.%';
-- DBA:全權限 + 授權權限
GRANT ALL PRIVILEGES ON *.* TO 'dba'@'localhost' WITH GRANT OPTION;
-- 唯讀報表
GRANT SELECT ON *.* TO 'report'@'%';
-- 複寫帳號
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'%';
REVOKE ALL PRIVILEGES ON *.* FROM 'old_user'@'%';
DELETE FROM mysql.user WHERE user='old_user' AND host='%';
FLUSH PRIVILEGES;
SHOW GRANTS FOR 'app'@'%';
SHOW GRANTS; -- 當前用戶
CREATE ROLE 'app_read', 'app_write';
GRANT SELECT ON db.* TO 'app_read';
GRANT INSERT, UPDATE, DELETE ON db.* TO 'app_write';
GRANT 'app_read', 'app_write' TO 'user1'@'%';
SET DEFAULT ROLE ALL TO 'user1'@'%';
GRANT 不會自動建立用戶 (5.7+ 已移除隱含建立),需先 CREATE USERWITH GRANT OPTION 允許受權者再授權,僅限 DBA 角色% 含 localhost,但 localhost 走 Unix Socket,127.0.0.1 走 TCP,需分別授權或用 %SELECT user, host FROM mysql.user 審計孤帳號