本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
RDS for My 的角色型權限模型SQL
從 RDS for MySQL 8.0.36 版開始,您無法直接修改mysql
資料庫中的資料表。特別是,您無法透過在grant
資料表上執行資料操作語言 (DML) 操作來建立資料庫使用者。反之,您可以使用我的SQL帳戶管理陳述式CREATE USER
,例如 GRANT
、 和 REVOKE
,將角色型權限授予使用者。您也無法建立其他類型的物件,例如 mysql
資料庫中已存放的程序。您仍然可以查詢 mysql
資料表。如果您使用二進位日誌複寫,則對來源資料庫執行個體上mysql
資料表所做的變更不會複寫至目標叢集。
在某些情況下,您的應用程式可能會使用捷徑來建立使用者或其他物件,方法是插入至 mysql
資料表。若是這樣,請變更您應用程式的程式碼來使用對應的陳述式,例如 CREATE
USER
。
若要在從外部 MySQL 資料庫遷移期間匯出資料庫使用者的中繼資料,請使用下列其中一種方法:
將 MySQL Shell 的執行個體傾印公用程式與篩選條件搭配使用,以排除使用者、角色和授予。下列範例顯示要使用的命令語法。確定
outputUrl
是空的。mysqlsh user@host -- util.dumpInstance(outputUrl,{excludeSchemas:['mysql'],users: true})
如需詳細資訊,請參閱我的SQL參考手冊中的執行個體傾印公用程式、結構描述傾印公用程式和資料表傾印公用程式
。 使用
mysqlpump
用戶端公用程式。此範例包含除mysql
系統資料庫中的資料表以外的所有資料表。它也包含CREATE USER
和GRANT
陳述式,以複寫遷移資料庫中的所有使用者SQL。mysqlpump --exclude-databases=mysql --users
若要簡化許多使用者或應用程式的權限管理,您可以使用 CREATE ROLE
陳述式來建立具有一組權限的角色。然後,您可以使用 GRANT
和 SET ROLE
陳述式,以及 current_role
函數,將角色指派給使用者或應用程式、切換目前角色,並檢查哪些角色有效。如需 MySQL 8.0 中角色型許可系統的詳細資訊,請參閱我的SQL參考手冊中的使用角色
重要
我們強烈建議您不要直接在您的應用程式中使用主要使用者。而是遵循最佳實務,使用以應用程式所需的最低權限建立的資料庫使用者。
從 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 activemysql>
SELECT CURRENT_ROLE();+--------------------------------------------------+ | CURRENT_ROLE() | +--------------------------------------------------+ | `CUSTOM_ROLE`@`%`,`rds_superuser_role`@`%` | +--------------------------------------------------+