首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 用戶全生命週期管理:建立、密碼變更、刪除與授權實戰

     編輯:MySQL 綜合教學

現代做法:CREATE USER + GRANT(MySQL 5.7.6+ / 8.0 推薦)

舊版直接操作 mysql.user 表已棄用,易導致權限表不一致。請改用 SQL 語句:

1. 建立用戶

-- 建立用戶並設定密碼、主機限制
CREATE USER 'lionbule'@'%' IDENTIFIED BY 'hello1234';
-- 僅允許本機連線
CREATE USER 'lionbule'@'localhost' IDENTIFIED BY 'hello1234';
-- 指定加密插件(MySQL 8.0 預設 caching_sha2_password)
CREATE USER 'lionbule'@'192.168.1.%' IDENTIFIED WITH mysql_native_password BY 'hello1234';

2. 修改密碼

-- MySQL 5.7.6+ / 8.0 標準語法
ALTER USER 'lionbule'@'%' IDENTIFIED BY 'new_strong_pass';

-- 或使用 SET PASSWORD(等效)
SET PASSWORD FOR 'lionbule'@'%' = 'new_strong_pass';

-- 5.7.6 前舊語法(不推薦)
-- UPDATE mysql.user SET authentication_string=PASSWORD('new') WHERE User='lionbule' AND Host='%';
-- FLUSH PRIVILEGES;

3. 刪除用戶


DROP USER 'lionbule'@'%';
DROP USER 'lionbule'@'localhost';

4. 權限授權(GRANT)


-- 全權限於單庫
GRANT ALL PRIVILEGES ON test.* TO 'lionbule'@'%' IDENTIFIED BY 'hello1234';

-- 細粒度:僅特定表 CRUD
GRANT SELECT, INSERT, UPDATE, DELETE ON test.orders TO 'lionbule'@'%';

-- 欄位級:隱藏敏感欄位
GRANT SELECT (id, username, email) ON test.users TO 'lionbule'@'%';

-- 存儲程序執行權限
GRANT EXECUTE ON PROCEDURE test.proc_name TO 'lionbule'@'%';

權限參數速查表

參數說明範例
權限ALL / SELECT / INSERT / UPDATE / DELETE / CREATE / DROP / ALTER / INDEX / EXECUTE / REFERENCES 等SELECT, INSERT
資料庫.表*.* 全庫全表;db.* 單庫;db.tbl 單表test.*
用戶名MySQL 帳號名lionbule
登入主機% 所有 IP;localhost 本機;192.168.1.% 網段;10.0.0.1 單 IP%
密碼IDENTIFIED BY 'pass'(GRANT 同時建用戶時)或 CREATE USER 時指定hello1234

關鍵注意事項

  1. GRANT 會隱式建立用戶(舊版行為):MySQL 8.0 移除此特性,必須先 CREATE USER 再 GRANT。
  2. FLUSH PRIVILEGES:直接操作授權表(INSERT/UPDATE/DELETE mysql.user 等)才需手動執行;CREATE USER/GRANT/DROP USER 會自動刷新。
  3. 主機名匹配規則:'user'@'%' 不匹配 localhost(Unix socket 連線),需單獨建 'user'@'localhost'。
  4. 密碼策略:MySQL 5.7+ 預設啟用 validate_password 插件,需符合長度/複雜度要求。
  5. 權限生效:授權後用戶需重新連線生效。

實戰管理腳本(Bash)

#!/bin/bash
# user_mgmt.sh create|drop|pass|grant db user host pass [privs]
set -euo pipefail

ACTION=$1; DB=$2; USER=$3; HOST=${4:-'%'}; PASS=$5; PRIVS=${6:-'ALL PRIVILEGES'}

mysql -uroot -p"${ROOT_PASS}" -e "
$(case $ACTION in
  create) echo "CREATE USER IF NOT EXISTS '${USER}'@'${HOST}' IDENTIFIED BY '${PASS}';" ;;
  drop)   echo "DROP USER IF EXISTS '${USER}'@'${HOST}';" ;;
  pass)   echo "ALTER USER '${USER}'@'${HOST}' IDENTIFIED BY '${PASS}';" ;;
  grant)  echo "GRANT ${PRIVS} ON \`${DB}\`.* TO '${USER}'@'${HOST}';" ;;
  *)      echo "SELECT 'Invalid action';" ;;
esac)
FLUSH PRIVILEGES;
"

使用範例:./user_mgmt.sh grant testdb lionbule % hello1234 "SELECT,INSERT,UPDATE"

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