文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  新增帳戶、指派權限和刪除帳戶

8.2.8 新增帳戶、指派權限和刪除帳戶

若要管理 MySQL 帳戶,請使用專為此目的設計的 SQL 陳述式

帳戶管理陳述式會導致伺服器對基礎授權表進行適當的修改,這會在第 8.2.3 節「授權表」中討論。

注意

不建議直接使用 INSERTUPDATEDELETE 等陳述式修改授權表,且後果自負。如果此類修改導致資料列格式不正確,伺服器可自由忽略這些資料列。

對於修改授權表的任何作業,伺服器會檢查表格是否具有預期的結構,如果沒有,則會產生錯誤。若要將表格更新為預期的結構,請執行 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 從本機主機連線時使用。它被授予全域的 RELOADPROCESS 管理權限。這些權限使 admin 使用者可以執行 mysqladmin reloadmysqladmin refreshmysqladmin 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';