Contents

MySQL 查看資料表權限

MySQL 的權限系統採用多層級設計,從全局到資料表欄位都能精細控制。了解如何查看和管理使用者權限,是資料庫管理員的基本技能。

MySQL 權限系統架構

MySQL 的權限分為四個層級,由大到小:

層級 說明 儲存位置
全局層級 所有資料庫的所有資料表 mysql.user
資料庫層級 特定資料庫的所有資料表 mysql.db
資料表層級 特定資料庫的特定資料表 mysql.tables_priv
欄位層級 特定欄位的讀寫權限 mysql.columns_priv

查看使用者權限

SHOW GRANTS(最常用)

1
2
3
4
5
6
7
8
-- 查看目前登入使用者的權限
SHOW GRANTS;
SHOW GRANTS FOR CURRENT_USER;

-- 查看指定使用者的權限
SHOW GRANTS FOR 'user'@'host';
SHOW GRANTS FOR 'appuser'@'%';
SHOW GRANTS FOR 'readonly'@'192.168.1.100';

輸出範例:

1
GRANT SELECT, INSERT, UPDATE ON `mydb`.* TO 'appuser'@'%'

查詢系統資料表

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
-- 查看資料庫層級權限(直接查 mysql.db)
SELECT Host, Db, User, Select_priv, Insert_priv, Update_priv, Delete_priv, 
       Create_priv, Drop_priv, Alter_priv
FROM mysql.db
WHERE User = 'appuser';

-- 查看資料表層級權限
SELECT * FROM mysql.tables_priv WHERE User = 'appuser';

-- 查看所有使用者
SELECT User, Host, plugin FROM mysql.user;

INFORMATION_SCHEMA 查詢

1
2
3
4
-- 查看資料表層級權限
SELECT GRANTEE, TABLE_SCHEMA, TABLE_NAME, PRIVILEGE_TYPE, IS_GRANTABLE
FROM INFORMATION_SCHEMA.TABLE_PRIVILEGES
WHERE TABLE_SCHEMA = 'mydb';

GRANT — 授予權限

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
-- 授予特定資料庫的所有權限
GRANT ALL PRIVILEGES ON mydb.* TO 'appuser'@'%';

-- 授予特定資料表的讀寫權限
GRANT SELECT, INSERT, UPDATE ON mydb.orders TO 'appuser'@'%';

-- 授予全局權限(所有資料庫)
GRANT SELECT ON *.* TO 'readonly'@'%';

-- 指定密碼並授予權限
GRANT SELECT ON mydb.* TO 'readonly'@'%' IDENTIFIED BY 'password123';

-- 授予並允許該使用者轉授給其他人
GRANT SELECT ON mydb.* TO 'admin'@'%' WITH GRANT OPTION;

-- 授予後重新載入權限
FLUSH PRIVILEGES;

REVOKE — 撤銷權限

1
2
3
4
5
6
7
-- 撤銷特定資料庫的特定權限
REVOKE INSERT, UPDATE ON mydb.* FROM 'appuser'@'%';

-- 撤銷所有權限
REVOKE ALL PRIVILEGES ON mydb.* FROM 'appuser'@'%';

FLUSH PRIVILEGES;

常見權限管理操作

建立只讀使用者

1
2
3
CREATE USER 'readonly'@'%' IDENTIFIED BY 'SecurePassword123';
GRANT SELECT ON mydb.* TO 'readonly'@'%';
FLUSH PRIVILEGES;

限制特定 IP 連線

1
2
3
4
5
6
7
-- 只允許從 192.168.1.0/24 網段連線
CREATE USER 'appuser'@'192.168.1.%' IDENTIFIED BY 'password';
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'appuser'@'192.168.1.%';

-- 只允許從特定 IP 連線
CREATE USER 'dbadmin'@'192.168.1.100' IDENTIFIED BY 'password';
GRANT ALL ON mydb.* TO 'dbadmin'@'192.168.1.100';

刪除使用者

1
DROP USER 'olduser'@'%';

MySQL 8.0 的 Role 功能

MySQL 8.0 新增了 Role(角色) 機制,可以將一組權限打包成角色,統一管理:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
-- 建立角色
CREATE ROLE 'read_only_role';
CREATE ROLE 'read_write_role';

-- 授予權限給角色
GRANT SELECT ON mydb.* TO 'read_only_role';
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'read_write_role';

-- 將角色指派給使用者
GRANT 'read_only_role' TO 'user1'@'%';
GRANT 'read_write_role' TO 'user2'@'%';

-- 設定預設角色(登入時自動啟用)
SET DEFAULT ROLE 'read_only_role' TO 'user1'@'%';

-- 查看角色
SHOW GRANTS FOR 'user1'@'%' USING 'read_only_role';

Role 的優點是當需要修改一組使用者的權限時,只需修改角色即可,不需逐一修改每個使用者。

參考資料