若要管理 MySQL 帳戶,請使用專為此目的設計的 SQL 陳述式
CREATE USER
和DROP USER
會建立和移除帳戶。SHOW GRANTS
會顯示帳戶權限指派。
帳戶管理陳述式會導致伺服器對基礎授權表進行適當的修改,這會在第 8.2.3 節「授權表」中討論。
不建議直接使用 INSERT
、UPDATE
或 DELETE
等陳述式修改授權表,且後果自負。如果此類修改導致資料列格式不正確,伺服器可自由忽略這些資料列。
對於修改授權表的任何作業,伺服器會檢查表格是否具有預期的結構,如果沒有,則會產生錯誤。若要將表格更新為預期的結構,請執行 MySQL 升級程序。請參閱第 3 章《升級 MySQL》。
建立帳戶的另一個選項是使用 GUI 工具 MySQL Workbench。此外,許多第三方程式也提供 MySQL 帳戶管理功能。phpMyAdmin
就是其中一個程式。
本節討論下列主題
如需有關此處討論的陳述式的其他資訊,請參閱第 15.7.1 節「帳戶管理陳述式」。
下列範例示範如何使用 mysql 用戶端程式來設定新的帳戶。這些範例假設 MySQL root
帳戶擁有 CREATE USER
權限以及其授與其他帳戶的所有權限。
在命令列中,以 MySQL root
使用者身分連線到伺服器,並在密碼提示中提供適當的密碼
$> mysql -u root -p
Enter password: (enter root password here)
連線到伺服器後,您可以新增新的帳戶。下列範例使用 CREATE USER
和 GRANT
陳述式來設定四個帳戶 (在您看到 '
的地方,請代入適當的密碼)password
'
CREATE USER 'finley'@'localhost'
IDENTIFIED BY 'password';
GRANT ALL
ON *.*
TO 'finley'@'localhost'
WITH GRANT OPTION;
CREATE USER 'finley'@'%.example.com'
IDENTIFIED BY 'password';
GRANT ALL
ON *.*
TO 'finley'@'%.example.com'
WITH GRANT OPTION;
CREATE USER 'admin'@'localhost'
IDENTIFIED BY 'password';
GRANT RELOAD,PROCESS
ON *.*
TO 'admin'@'localhost';
CREATE USER 'dummy'@'localhost';
這些陳述式建立的帳戶具有下列屬性
有兩個帳戶的使用者名稱皆為
finley
。這兩個都是超級使用者帳戶,擁有執行任何操作的完整全域權限。'finley'@'localhost'
帳戶只能在從本機主機連線時使用。'finley'@'%.example.com'
帳戶在其主機部分使用了'%'
萬用字元,因此可以用於從example.com
網域中的任何主機連線。如果
localhost
有匿名使用者帳戶,則'finley'@'localhost'
帳戶是必要的。如果沒有'finley'@'localhost'
帳戶,當finley
從本機主機連線時,該匿名使用者帳戶會優先使用,並且finley
會被視為匿名使用者。原因是匿名使用者帳戶的Host
欄位值比'finley'@'%'
帳戶更具體,因此在user
表格的排序順序中較早出現。(有關user
表格排序的資訊,請參閱第 8.2.6 節「存取控制,階段 1:連線驗證」。)'admin'@'localhost'
帳戶只能由admin
從本機主機連線時使用。它被授予全域的RELOAD
和PROCESS
管理權限。這些權限使admin
使用者可以執行 mysqladmin reload、mysqladmin refresh 和 mysqladmin flush-xxx
命令,以及 mysqladmin processlist。沒有授予存取任何資料庫的權限。您可以使用GRANT
陳述式來新增此類權限。'dummy'@'localhost'
帳戶沒有密碼(這是不安全的,不建議這樣做)。此帳戶只能從本機主機連線時使用。沒有授予任何權限。假設您使用GRANT
陳述式來授予該帳戶特定的權限。
先前的範例是在全域層級授予權限。下一個範例會建立三個帳戶,並在較低的層級授予其存取權;也就是說,存取特定的資料庫或資料庫中的物件。每個帳戶的使用者名稱都是 custom
,但主機名稱部分不同。
CREATE USER 'custom'@'localhost'
IDENTIFIED BY 'password';
GRANT ALL
ON bankaccount.*
TO 'custom'@'localhost';
CREATE USER 'custom'@'host47.example.com'
IDENTIFIED BY 'password';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
ON expenses.*
TO 'custom'@'host47.example.com';
CREATE USER 'custom'@'%.example.com'
IDENTIFIED BY 'password';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
ON customer.addresses
TO 'custom'@'%.example.com';
這三個帳戶可依以下方式使用:
'custom'@'localhost'
帳戶具有存取bankaccount
資料庫的所有資料庫層級權限。該帳戶只能從本機主機連線到伺服器。'custom'@'host47.example.com'
帳戶具有存取expenses
資料庫的特定資料庫層級權限。該帳戶只能從主機host47.example.com
連線到伺服器。'custom'@'%.example.com'
帳戶具有存取customer
資料庫中addresses
表格的特定表格層級權限,並且可以從example.com
網域中的任何主機存取。由於帳戶名稱的主機部分使用了%
萬用字元,該帳戶可以從網域中的所有機器連線到伺服器。
若要查看帳戶的權限,請使用 SHOW GRANTS
mysql> SHOW GRANTS FOR 'admin'@'localhost';
+-----------------------------------------------------+
| Grants for admin@localhost |
+-----------------------------------------------------+
| GRANT RELOAD, PROCESS ON *.* TO `admin`@`localhost` |
+-----------------------------------------------------+
若要查看帳戶的非權限屬性,請使用 SHOW CREATE USER
mysql> SET print_identified_with_as_hex = ON;
mysql> SHOW CREATE USER 'admin'@'localhost'\G
*************************** 1. row ***************************
CREATE USER for admin@localhost: CREATE USER `admin`@`localhost`
IDENTIFIED WITH 'caching_sha2_password'
AS 0x24412430303524301D0E17054E2241362B1419313C3E44326F294133734B30792F436E77764270373039612E32445250786D43594F45354532324B6169794F47457852796E32
REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK
PASSWORD HISTORY DEFAULT
PASSWORD REUSE INTERVAL DEFAULT
PASSWORD REQUIRE CURRENT DEFAULT
啟用 print_identified_with_as_hex
系統變數會導致 SHOW CREATE USER
將包含無法列印字元的雜湊值顯示為十六進位字串,而不是一般字串文字。
若要撤銷帳戶權限,請使用 REVOKE
陳述式。權限可以在不同的層級撤銷,就像它們可以在不同的層級授予一樣。
撤銷全域權限
REVOKE ALL
ON *.*
FROM 'finley'@'%.example.com';
REVOKE RELOAD
ON *.*
FROM 'admin'@'localhost';
撤銷資料庫層級權限
REVOKE CREATE,DROP
ON expenses.*
FROM 'custom'@'host47.example.com';
撤銷表格層級權限
REVOKE INSERT,UPDATE,DELETE
ON customer.addresses
FROM 'custom'@'%.example.com';
若要檢查權限撤銷的效果,請使用 SHOW GRANTS
mysql> SHOW GRANTS FOR 'admin'@'localhost';
+---------------------------------------------+
| Grants for admin@localhost |
+---------------------------------------------+
| GRANT PROCESS ON *.* TO `admin`@`localhost` |
+---------------------------------------------+
若要移除帳戶,請使用 DROP USER
陳述式。例如,若要刪除先前建立的一些帳戶
DROP USER 'finley'@'localhost';
DROP USER 'finley'@'%.example.com';
DROP USER 'admin'@'localhost';
DROP USER 'dummy'@'localhost';