首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL GRANT 與 REVOKE 權限管理完整語法與實戰指南

     編輯:MySQL 資料庫相關知識

MySQL GRANT 與 REVOKE 權限管理完整語法與實戰指南

MySQL 權限系統採用分層架構:全域 → 資料庫 → 表 → 欄位 → 程序。本文詳細解析 GRANT 與 REVOKE 完整語法、權限層級、SSL/X509 安全連線要求、資源限制與實戰最佳實踐。

一、GRANT 完整語法結構

GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...
  ON [object_type] {tbl_name | * | *.* | db_name.*}
  TO user [IDENTIFIED BY [PASSWORD] 'password']
      [, user [IDENTIFIED BY [PASSWORD] 'password']] ...
  [REQUIRE
      NONE |
      [{SSL | X509}]
      [CIPHER 'cipher' [AND]]
      [ISSUER 'issuer' [AND]]
      [SUBJECT 'subject']]
  [WITH with_option [with_option] ...]

with_option:
  GRANT OPTION
  | MAX_QUERIES_PER_HOUR count
  | MAX_UPDATES_PER_HOUR count
  | MAX_CONNECTIONS_PER_HOUR count
  | MAX_USER_CONNECTIONS count

object_type: TABLE | FUNCTION | PROCEDURE

二、REVOKE 完整語法結構

REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ...
  ON [object_type] {tbl_name | * | *.* | db_name.*}
  FROM user [, user] ...

REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...

核心差異:TO → FROM,無 IDENTIFIED BY、WITH GRANT OPTION、REQUIRE 子句。

三、五大權限層級與儲存位置

層級適用範圍儲存表典型語法
全域伺服器所有資料庫mysql.userGRANT ALL ON *.* TO 'dba'@'%';
資料庫指定資料庫所有物件mysql.db, mysql.hostGRANT ALL ON mydb.* TO 'dev'@'%';
表指定表所有欄位mysql.tables_privGRANT SELECT,INSERT ON mydb.t1 TO 'app'@'%';
欄位指定表單一欄位mysql.columns_privGRANT SELECT(id,name) ON mydb.t1 TO 'app'@'%';
程序預存程序/函數mysql.procs_privGRANT EXECUTE ON PROCEDURE mydb.p1 TO 'app'@'%';

四、常用權限類型對照表

權限允許操作層級
ALL [PRIVILEGES]除 GRANT OPTION 外所有權限所有
SELECT查詢資料全域/庫/表/欄位
INSERT插入資料全域/庫/表/欄位
UPDATE修改資料全域/庫/表/欄位
DELETE刪除資料全域/庫/表
CREATE建立資料庫/表/索引全域/庫/表
DROP刪除資料庫/表/視圖全域/庫/表
ALTER修改表結構全域/庫/表
INDEX建立/刪除索引全域/庫/表
EXECUTE執行預存程序全域/庫/程序
CREATE ROUTINE建立預存程序/函數全域/庫
ALTER ROUTINE修改/刪除預存程序全域/庫/程序
CREATE VIEW建立視圖全域/庫
SHOW VIEW查看視圖定義全域/庫
CREATE USER建立/刪除/重命名用戶全域
FILESELECT ... INTO OUTFILE, LOAD DATA INFILE僅全域
PROCESSSHOW FULL PROCESSLIST僅全域
RELOADFLUSH 操作僅全域
REPLICATION SLAVE從庫讀取 Binlog僅全域
REPLICATION CLIENT查詢主/從位址僅全域
SUPERCHANGE MASTER, KILL, PURGE MASTER LOGS, SET GLOBAL僅全域
SHUTDOWNmysqladmin shutdown僅全域
GRANT OPTION將自身權限授予他人全域/庫/表
USAGE無實際權限(建立用戶用)全域

五、用戶帳號命名規則

  • 格式:'user_name'@'host_name'
  • 主機名支援萬用字元:'%'(任意主機)、'192.168.1.%'(C 類網段)、'%.example.com'(網域)
  • 用戶名不支援萬用字元
  • 含特殊字元(-、%、_)需用單引號包裹:'test-user'@'%.example.com'
  • 資料庫/表/欄位/程序名含特殊字元用反引號:\`db-name\`.\`tbl_name\`
  • 密碼用單引號:IDENTIFIED BY 'pass_word'
  • 匿名用戶:''@'localhost'(生產環境建議刪除)

六、SSL/X509 安全連線要求(REQUIRE 子句)

模式語法範例說明
無要求GRANT ... TO 'u'@'%';允許非加密;客戶端有憑證可選擇加密
要求 SSLGRANT ... TO 'u'@'%' REQUIRE SSL;僅允許 SSL 加密連線
要求 X509GRANT ... TO 'u'@'%' REQUIRE X509;需有效憑證(CA 可驗證簽名),不檢查具體簽發者/主體
指定簽發者REQUIRE ISSUER '/C=CN/ST=.../CN=CA'憑證必須由指定 CA 簽發
指定主體REQUIRE SUBJECT '/C=CN/.../CN=client'憑證主體必須完全匹配
指定加密套件REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA'強制使用特定加密演算法
組合REQUIRE SUBJECT '...' AND ISSUER '...' AND CIPHER '...'多條件同時滿足

七、資源限制(WITH 子句)

  • MAX_QUERIES_PER_HOUR N:每小時最大查詢數
  • MAX_UPDATES_PER_HOUR N:每小時最大更新數
  • MAX_CONNECTIONS_PER_HOUR N:每小時最大連線數
  • MAX_USER_CONNECTIONS N:同一用戶同時連線上限(0=受 max_user_connections 系統變數控制)
  • 修改現有用戶資源限制不影響權限:GRANT USAGE ON *.* TO 'u'@'%' WITH MAX_QUERIES_PER_HOUR 1000;

八、實戰最佳實踐

  1. 最小權限原則:應用帳號僅授予必要庫/表的 SELECT/INSERT/UPDATE/DELETE,嚴禁 GRANT ALL ON *.*
  2. 區分環境帳號:開發/測試/生產使用不同帳號,生產帳號僅限 DBA 與自動化部署系統持有
  3. 避免匿名用戶:DELETE FROM mysql.user WHERE User=''; FLUSH PRIVILEGES;
  4. 本地帳號優先:應用與資料庫同機時,用 'app'@'localhost' 配合 Unix socket,效能更高且避免網路暴露
  5. 定期審計:SHOW GRANTS FOR 'user'@'host'; 檢查權限是否過度
  6. 撤銷權限後需重連:權限變更即時生效於新連線,現有連線需重連或執行 FLUSH PRIVILEGES
  7. 備份授權表:遷移升級前備份 mysql.user, mysql.db, mysql.tables_priv, mysql.columns_priv, mysql.procs_priv

九、常見陷阱

  • DROP DATABASE 不自動清除相關權限記錄,需手動清理 mysql.db
  • DROP USER 會清除所有層級權限(含程序層級)
  • 舊版本升級後需執行 mysql_upgrade 更新授權表結構,否則新權限類型(如 CREATE ROUTINE)無法使用
  • REVOKE 不刪除用戶帳號,需額外 DROP USER 或 DELETE FROM mysql.user
  • 通配符資料庫名(foo\_bar)授權時需轉義底線:GRANT ... ON \`foo\_bar\`.* TO ...
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved