

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# RDS for MySQL 的角色型權限模型
<a name="Appendix.MySQL.CommonDBATasks.privilege-model"></a>

從 RDS for MySQL 8.0.36 版開始，您無法直接修改 `mysql` 資料庫中的資料表。特別是，您無法透過對 `grant` 資料表執行資料處理語言 (DML) 操作來建立資料庫使用者。相反地，您可以使用 MySQL 帳戶管理陳述式，例如 `CREATE USER`、`GRANT` 和 `REVOKE`，將角色型權限授予使用者。您也無法建立其他類型的物件，例如 `mysql` 資料庫中已存放的程序。您仍然可以查詢 `mysql` 資料表。如果您使用二進位日誌複寫，則直接對來源資料庫執行個體上 `mysql` 資料表所做的變更不會複寫至目標叢集。

在某些情況下，您的應用程式可能會使用捷徑來建立使用者或其他物件，方法是插入至 `mysql` 資料表。若是這樣，請變更您應用程式的程式碼來使用對應的陳述式，例如 `CREATE USER`。

若要在遷移期間從外部 MySQL 資料庫匯出資料庫使用者的中繼資料，請使用下列其中一個方法：
+ 使用 MySQL Shell 的執行個體傾印公用程式搭配篩選條件來排除使用者、角色和授權。以下範例顯示要使用的命令語法。請確定 `outputUrl` 是空的。

  ```
  mysqlsh user@host -- util.dumpInstance(outputUrl,{excludeSchemas:['mysql'],users: true})
  ```

  如需詳細資訊，請參閱《MySQL 參考手冊》中的[執行個體傾印公用程式、結構描述傾印公用程式和資料表傾印公用程式](https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-utilities-dump-instance-schema.html)。
+ 使用 `mysqlpump` 用戶端公用程式。此範例包含 `mysql` 系統資料庫中資料表以外的所有資料表。它也包括 `CREATE USER` 和 `GRANT` 陳述式，來重新產生所遷移資料庫中的所有 MySQL 使用者。

  ```
  mysqlpump --exclude-databases=mysql --users
  ```

  MySQL 8.4 不再提供 `mysqlpump` 用戶端公用程式。請改用 `mysqldump`。

若要簡化許多使用者或應用程式的權限管理，您可以使用 `CREATE ROLE` 陳述式來建立具有一組權限的角色。然後，您可以使用 `GRANT` 和 `SET ROLE` 陳述式，以及 `current_role` 函數，將角色指派給使用者或應用程式、切換目前角色，並檢查哪些角色有效。如需 MySQL 8.0 中角色型權限系統的詳細資訊，請參閱《MySQL 參考手冊》中的[使用角色](https://dev.mysql.com/doc/refman/8.0/en/roles.html)。

**重要**  
我們強烈建議您不要直接在您的應用程式中使用主要使用者。而是遵循最佳實務，使用以應用程式所需的最低權限建立的資料庫使用者。

從 8.0.36 版開始，RDS for MySQL 包含具有下列所有權限的特殊角色。此角色已命名為 `rds_superuser_role`。每個資料庫執行個體的主要管理使用者已獲授予此角色。`rds_superuser_role` 角色包含所有資料庫物件的下列權限：
+  `ALTER` 
+  `APPLICATION_PASSWORD_ADMIN` 
+  `ALTER ROUTINE` 
+  `CREATE` 
+  `CREATE ROLE` 
+  `CREATE ROUTINE` 
+  `CREATE TEMPORARY TABLES` 
+  `CREATE USER` 
+  `CREATE VIEW` 
+  `DELETE` 
+  `DROP` 
+  `DROP ROLE` 
+  `EVENT` 
+  `EXECUTE` 
+  `INDEX` 
+  `INSERT` 
+  `LOCK TABLES` 
+  `PROCESS` 
+  `REFERENCES` 
+  `RELOAD` 
+  `REPLICATION CLIENT` 
+  `REPLICATION SLAVE` 
+  `ROLE_ADMIN` 
+  `SET_USER_ID` 
+  `SELECT` 
+  `SHOW DATABASES` 
+  `SHOW VIEW` 
+  `TRIGGER` 
+  `UPDATE` 
+  `XA_RECOVER_ADMIN`

 角色定義還包括 `WITH GRANT OPTION`，以便管理使用者可以將該角色授與其他使用者。尤其，管理員必須授與執行二進位日誌複寫所需的任何權限，以 MySQL 叢集做為目標。

**提示**  
 若要查看許可的完整詳細資訊，請使用下列陳述式。  

```
SHOW GRANTS FOR rds_superuser_role@'%';
```

 當使用 RDS for MySQL 8.0.36 版及更新版本中的角色授予存取權時，您也可以使用 `SET ROLE role_name` 或 `SET ROLE ALL` 陳述式啟用角色。下列範例會顯示作法。以適當的角色名稱替代 `CUSTOM_ROLE`。

```
# Grant role to user
mysql> GRANT CUSTOM_ROLE TO 'user'@'domain-or-ip-address'

# Check the current roles for your user. In this case, the CUSTOM_ROLE role has not been activated.
# Only the rds_superuser_role is currently in effect.
mysql> SELECT CURRENT_ROLE();
+--------------------------+
| CURRENT_ROLE()           |
+--------------------------+
| `rds_superuser_role`@`%` |
+--------------------------+
1 row in set (0.00 sec)

# Activate all roles associated with this user using SET ROLE.
# You can activate specific roles or all roles.
# In this case, the user only has 2 roles, so we specify ALL.
mysql> SET ROLE ALL;
Query OK, 0 rows affected (0.00 sec)

# Verify role is now active
mysql> SELECT CURRENT_ROLE();
+--------------------------------------------------+
| CURRENT_ROLE()                                   |
+--------------------------------------------------+
| `CUSTOM_ROLE`@`%`,`rds_superuser_role`@`%` |
+--------------------------------------------------+
```