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

MySQL GRANT 語句完整指南:從建立用戶、授權精細控制到權限表直接操作

     編輯:MySQL 資料庫相關知識

前言

GRANT 是 MySQL 管理用戶權限的核心語句,支援帳號建立、密碼設定、庫/表/欄位/程序級授權、資源限制與 SSL 強制。本文系統梳理語法、實例與底層權限表機制。

一、基本語法結構

GRANT priv_type [(column_list)]
  ON [object_type] priv_level
  TO user_specification [, user_specification] ...
  [REQUIRE {NONE | ssl_option ...}]
  [WITH with_option ...];
  • priv_type:ALL PRIVILEGES、SELECT、INSERT、UPDATE、DELETE、CREATE、DROP、GRANT OPTION、RELOAD、PROCESS、SUPER、FILE 等
  • priv_level:*.*(全域)、db.*(庫級)、db.tbl(表級)、tbl.col(欄位級)、PROCEDURE db.proc(程序級)
  • user_specification:'user'@'host' IDENTIFIED BY 'pass' [WITH GRANT OPTION]
  • WITH 選項:GRANT OPTION、MAX_QUERIES_PER_HOUR n、MAX_CONNECTIONS_PER_HOUR n、MAX_USER_CONNECTIONS n、SSL、X509

二、經典實例場景

1. 建立超級管理員(可從任意主機連線)

GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%' IDENTIFIED BY 'strongPass!' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost' IDENTIFIED BY 'strongPass!' WITH GRANT OPTION;
-- 必須同時建立 localhost 與 % 兩條,否則匿名用戶 @localhost 優先級更高導致無法登入

2. 建立僅具管理權限的運維帳號

GRANT RELOAD, PROCESS ON *.* TO 'admin'@'localhost' IDENTIFIED BY 'adminPass!';
-- 可執行 mysqladmin reload/flush-*、SHOW PROCESSLIST,無資料存取權

3. 建立無密碼本地只讀帳號(佔位,後續再授權)

GRANT USAGE ON *.* TO 'dummy'@'localhost';
-- USAGE = 無任何權限,僅建立帳號記錄

4. 業務應用帳號:分庫分表精細授權

-- 僅能從 localhost 存取 bankaccount 庫
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON bankaccount.* TO 'custom'@'localhost' IDENTIFIED BY 'stupid';

-- 僅能從 whitehouse.gov 存取 expenses 庫
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON expenses.* TO 'custom'@'whitehouse.gov' IDENTIFIED BY 'stupid';

-- 從任意主機存取 customer 庫
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON customer.* TO 'custom'@'%' IDENTIFIED BY 'stupid';

三、底層權限表直接操作(等效 GRANT)

MySQL 權限實際儲存在 mysql 資料庫的 user、db、tables_priv、columns_priv、procs_priv 表中。直接 INSERT 後需 FLUSH PRIVILEGES 生效。

INSERT INTO mysql.user (Host, User, authentication_string, Select_priv, Insert_priv, ...)
VALUES ('localhost', 'monty', PASSWORD('something'), 'Y', 'Y', ...);

INSERT INTO mysql.db (Host, Db, User, Select_priv, Insert_priv, ...)
VALUES ('localhost', 'bankaccount', 'custom', 'Y', 'Y', ...);

FLUSH PRIVILEGES;

注意: MySQL 5.7+ password 欄位更名為 authentication_string,PASSWORD() 函數已棄用,建議改用 GRANT 或 CREATE USER ... IDENTIFIED BY。

四、權限生效機制與常見坑

現象原因解決
新建用戶無法登入匿名用戶 ''@'localhost' 優先級更高刪除匿名用戶 DROP USER ''@'localhost'; 或建立同名 localhost 帳號
GRANT 執行後權限未生效未執行 FLUSH PRIVILEGES(直接操作權限表時)GRANT 語句自動刷新,手動 INSERT 需額外 FLUSH
跨主機連線被拒Host 欄位不匹配(IP vs 域名、% 不包含 localhost)同時建立 user@'%' 與 user@'localhost'
密碼修改不生效使用舊 PASSWORD() 函數或未刷新改用 ALTER USER 'u'@'h' IDENTIFIED BY 'newpass';

五、最佳實踐檢查清單

  • ✅ 應用帳號僅授予特定庫 SELECT/INSERT/UPDATE/DELETE
  • ✅ 禁止 GRANT ALL ON *.* 給非 DBA 帳號
  • ✅ 啟用 REQUIRE SSL 強制加密傳輸
  • ✅ 設定 MAX_USER_CONNECTIONS 防止連線洩漏拖垮實例
  • ✅ 定期 SELECT User, Host FROM mysql.user; 審計帳號清單
  • ✅ 移除無用帳號、匿名帳號、測試帳號

結語

權限管理的核心是最小權限原則與審計可追溯。熟練掌握 GRANT 語法細節、理解底層權限表關係、建立標準化帳號命名與授權模板,才能在合規與效率間取得平衡。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved