MySQL 的權限管理系統相當靈活,透過 GRANT 指令可以精細控制使用者對資料庫物件的存取權限。本文以 MySQL 5.0 及以上版本為基礎,系統整理常見授權場景與語法細節,供 DBA 與開發人員快速參考。
核心語法結構如下:
GRANT 權限 ON 資料庫物件 TO 使用者帳號
其中「資料庫物件」可為整個伺服器(*.*)、單一資料庫(db_name.*)、單一資料表(db_name.tbl_name)、欄位層級,甚至特定預存程序/函數。
針對唯讀或需增刪改查的應用帳號,通常只授予 DML 權限:
GRANT SELECT, INSERT, UPDATE, DELETE ON testdb.* TO 'common_user'@'%';
也可分開授予,效果相同。
開發人員除基本 CRUD 外,常需建立/修改表結構、索引、視圖、預存程序等:
GRANT CREATE, ALTER, DROP ON testdb.* TO 'developer'@'192.168.0.%';GRANT REFERENCES, CREATE TEMPORARY TABLES ON testdb.* TO 'developer'@'192.168.0.%';GRANT INDEX ON testdb.* TO 'developer'@'192.168.0.%';GRANT CREATE VIEW, SHOW VIEW ON testdb.* TO 'developer'@'192.168.0.%';GRANT CREATE ROUTINE, ALTER ROUTINE, EXECUTE ON testdb.* TO 'developer'@'192.168.0.%';GRANT ALL PRIVILEGES ON testdb TO 'dba'@'localhost';
PRIVILEGES 關鍵字可省略。
GRANT ALL ON *.* TO 'dba'@'localhost';
GRANT SELECT (id, name) ON testdb.tbl TO 'user'@'host';GRANT EXECUTE ON PROCEDURE testdb.proc TO 'user'@'host';SHOW GRANTS; -- 當前使用者 SHOW GRANTS FOR 'dba'@'localhost'; -- 指定使用者
語法與 GRANT 幾乎相同,僅將 TO 改為 FROM:
REVOKE ALL ON *.* FROM 'dba'@'localhost';
GRANT SELECT ON testdb.* TO 'dba'@'localhost' WITH GRANT OPTION;