舊版直接操作 mysql.user 表已棄用,易導致權限表不一致。請改用 SQL 語句:
-- 建立用戶並設定密碼、主機限制
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';
-- 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;
DROP USER 'lionbule'@'%';
DROP USER 'lionbule'@'localhost';
-- 全權限於單庫
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 |
CREATE USER 再 GRANT。CREATE USER/GRANT/DROP USER 會自動刷新。'user'@'%' 不匹配 localhost(Unix socket 連線),需單獨建 'user'@'localhost'。validate_password 插件,需符合長度/複雜度要求。#!/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"