若要管理 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'
帳號擁有從example.com
網域中的任何主機存取customer
資料庫中addresses
資料表的特定資料表層級權限。由於帳號名稱的主機部分使用了%
通配符,因此該帳號可以用於從網域中的所有機器連線到伺服器。
若要查看帳號的權限,請使用 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';