文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 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 參考手冊  /  ...  /  MySQL 提供的權限

8.2.2 MySQL 提供的權限

授予 MySQL 帳戶的權限決定了該帳戶可以執行的操作。MySQL 權限在它們適用的內容以及不同的操作層級上有所不同

  • 管理權限可讓使用者管理 MySQL 伺服器的操作。這些權限是全域性的,因為它們不是特定於特定資料庫。

  • 資料庫權限適用於資料庫及其中的所有物件。這些權限可以針對特定資料庫授與,也可以全域授與,使其適用於所有資料庫。

  • 資料庫物件 (例如資料表、索引、檢視和預存常式) 的權限可以針對資料庫內的特定物件、資料庫內特定類型的所有物件 (例如,資料庫中的所有資料表) 或全域中所有資料庫中給定類型的所有物件授與。

權限在它們是靜態 (內建於伺服器) 還是動態 (在執行階段定義) 方面也有所不同。權限是靜態還是動態會影響其授與使用者帳戶和角色的可用性。如需靜態和動態權限之間差異的相關資訊,請參閱靜態與動態權限。)

關於帳戶權限的資訊儲存在 mysql 系統資料庫中的授權表中。如需這些資料表的結構和內容說明,請參閱第 8.2.3 節「授權表」。MySQL 伺服器會在啟動時將授權表的內容讀取到記憶體中,並在第 8.2.13 節「權限變更何時生效」中指示的情況下重新載入。伺服器會根據授權表的記憶體複本做出存取控制決策。

重要事項

某些 MySQL 版本會對授權表進行變更,以新增新的權限或功能。為了確保您可以利用任何新功能,請在每次升級 MySQL 時,將您的授權表更新為目前的結構。請參閱第 3 章升級 MySQL

以下各節概述了可用的權限,提供了每個權限的更詳細說明,並提供了使用指南。

可用權限摘要

下表顯示 GRANTREVOKE 陳述式中使用的靜態權限名稱,以及授權表中與每個權限關聯的資料行名稱和權限適用的內容。

表 8.2 GRANT 和 REVOKE 的允許靜態權限

權限 授權表資料行 內容
ALL [PRIVILEGES] 所有權限」的同義詞 伺服器管理
ALTER Alter_priv 資料表
ALTER ROUTINE Alter_routine_priv 預存常式
CREATE Create_priv 資料庫、資料表或索引
CREATE ROLE Create_role_priv 伺服器管理
CREATE ROUTINE Create_routine_priv 預存常式
CREATE TABLESPACE Create_tablespace_priv 伺服器管理
CREATE TEMPORARY TABLES Create_tmp_table_priv 資料表
CREATE USER Create_user_priv 伺服器管理
CREATE VIEW Create_view_priv 檢視
DELETE Delete_priv 資料表
DROP Drop_priv 資料庫、資料表或檢視
DROP ROLE Drop_role_priv 伺服器管理
EVENT Event_priv 資料庫
EXECUTE Execute_priv 預存常式
FILE File_priv 伺服器主機上的檔案存取權
GRANT OPTION Grant_priv 資料庫、資料表或儲存程序
INDEX Index_priv 資料表
INSERT Insert_priv 資料表或欄位
LOCK TABLES Lock_tables_priv 資料庫
PROCESS Process_priv 伺服器管理
PROXY 請參閱 proxies_priv 表格 伺服器管理
REFERENCES References_priv 資料庫或資料表
RELOAD Reload_priv 伺服器管理
REPLICATION CLIENT Repl_client_priv 伺服器管理
REPLICATION SLAVE Repl_slave_priv 伺服器管理
SELECT Select_priv 資料表或欄位
SHOW DATABASES Show_db_priv 伺服器管理
SHOW VIEW Show_view_priv 檢視
SHUTDOWN Shutdown_priv 伺服器管理
SUPER Super_priv 伺服器管理
TRIGGER Trigger_priv 資料表
UPDATE Update_priv 資料表或欄位
USAGE 與「沒有權限」同義 伺服器管理

下表顯示 GRANTREVOKE 陳述式中使用的動態權限名稱,以及權限適用的內容。

表 8.3:GRANT 和 REVOKE 的允許動態權限

權限 內容
ALLOW_NONEXISTENT_DEFINER 孤立物件保護
APPLICATION_PASSWORD_ADMIN 雙重密碼管理
AUDIT_ABORT_EXEMPT 允許稽核日誌篩選器封鎖的查詢
AUDIT_ADMIN 稽核日誌管理
AUTHENTICATION_POLICY_ADMIN 驗證管理
BACKUP_ADMIN 備份管理
BINLOG_ADMIN 備份與複寫管理
BINLOG_ENCRYPTION_ADMIN 備份與複寫管理
CLONE_ADMIN 複製管理
CONNECTION_ADMIN 伺服器管理
ENCRYPTION_KEY_ADMIN 伺服器管理
FIREWALL_ADMIN 防火牆管理
FIREWALL_EXEMPT 防火牆管理
FIREWALL_USER 防火牆管理
FLUSH_OPTIMIZER_COSTS 伺服器管理
FLUSH_PRIVILEGES 伺服器管理
FLUSH_STATUS 伺服器管理
FLUSH_TABLES 伺服器管理
FLUSH_USER_RESOURCES 伺服器管理
GROUP_REPLICATION_ADMIN 複寫管理
GROUP_REPLICATION_STREAM 複寫管理
INNODB_REDO_LOG_ARCHIVE 重做日誌歸檔管理
INNODB_REDO_LOG_ENABLE 重做日誌管理
MASKING_DICTIONARIES_ADMIN 伺服器管理
NDB_STORED_USER NDB 叢集
OPTIMIZE_LOCAL_TABLE OPTIMIZE LOCAL TABLE 陳述式
PASSWORDLESS_USER_ADMIN 驗證管理
PERSIST_RO_VARIABLES_ADMIN 伺服器管理
REPLICATION_APPLIER 複寫通道的 PRIVILEGE_CHECKS_USER
REPLICATION_SLAVE_ADMIN 複寫管理
RESOURCE_GROUP_ADMIN 資源群組管理
RESOURCE_GROUP_USER 資源群組管理
ROLE_ADMIN 伺服器管理
SENSITIVE_VARIABLES_OBSERVER 伺服器管理
SESSION_VARIABLES_ADMIN 伺服器管理
SET_ANY_DEFINER 伺服器管理
SHOW_ROUTINE 伺服器管理
SKIP_QUERY_REWRITE 伺服器管理
SYSTEM_USER 伺服器管理
SYSTEM_VARIABLES_ADMIN 伺服器管理
TABLE_ENCRYPTION_ADMIN 伺服器管理
TELEMETRY_LOG_ADMIN 適用於 AWS HeatWave 的遙測日誌管理
TP_CONNECTION_ADMIN 執行緒集區管理
TRANSACTION_GTID_TAG 複寫管理
VERSION_TOKEN_ADMIN 伺服器管理
XA_RECOVER_ADMIN 伺服器管理

靜態權限描述

靜態權限是內建於伺服器中的,與在執行階段定義的動態權限不同。以下清單描述 MySQL 中可用的每個靜態權限。

特定的 SQL 陳述式可能會有比此處所指示的更具體的權限要求。如果是這樣,相關陳述式的描述會提供詳細資訊。

動態權限說明

動態權限是在執行階段定義的,與內建於伺服器中的靜態權限相反。以下清單說明 MySQL 中可用的每個動態權限。

大多數動態權限是在伺服器啟動時定義的。其他則由特定的元件或外掛程式定義,如權限說明中所述。在這種情況下,除非啟用定義權限的元件或外掛程式,否則該權限將無法使用。

特定的 SQL 陳述式可能會有比此處所指示的更具體的權限要求。如果是這樣,相關陳述式的描述會提供詳細資訊。

權限授予準則

只將帳戶需要的權限授予該帳戶是一個好主意。在授予 FILE 和管理權限時,您應特別謹慎。

  • FILE 可能會被濫用,以將 MySQL 伺服器可以在伺服器主機上讀取的所有檔案讀取到資料庫表格中。這包括所有可世界讀取的檔案和伺服器資料目錄中的檔案。然後可以使用 SELECT 來存取該表格,以將其內容傳輸到用戶端主機。

  • GRANT OPTION 允許使用者將他們的權限授予其他使用者。兩個具有不同權限和 GRANT OPTION 權限的使用者可以合併權限。

  • ALTER 可能會被用來透過重新命名表格來顛覆權限系統。

  • SHUTDOWN 可能會被濫用,透過終止伺服器來完全拒絕其他使用者的服務。

  • PROCESS 可用於檢視目前正在執行的陳述式的純文字,包括設定或變更密碼的陳述式。

  • SUPER 可用於終止其他工作階段或變更伺服器的運作方式。

  • 針對 mysql 系統資料庫本身授予的權限可用於變更密碼和其他存取權限資訊。

    • 密碼會以加密方式儲存,因此惡意使用者無法單純讀取密碼來得知純文字密碼。但是,具有 mysql.user 系統表格 authentication_string 資料行寫入權限的使用者可以變更帳戶的密碼,然後使用該帳戶連接到 MySQL 伺服器。

    • 針對 mysql 系統資料庫授予的 INSERTUPDATE 允許使用者分別新增權限或修改現有權限。

    • 針對 mysql 系統資料庫授予的 DROP 允許使用者遠端移除權限表格,甚至是資料庫本身。

靜態權限與動態權限

MySQL 支援靜態權限和動態權限。

  • 靜態權限內建於伺服器中。它們始終可用於授予使用者帳戶,並且無法取消註冊。

  • 動態權限可以在執行階段註冊和取消註冊。這會影響它們的可用性:尚未註冊的動態權限無法授予。

例如,SELECTINSERT 權限是靜態的,而且始終可用,而動態權限只有在啟用實作它的元件時才會變成可用。

本節的其餘部分說明動態權限在 MySQL 中的運作方式。討論會使用「元件」一詞,但同樣適用於外掛程式。

注意

伺服器管理員應注意哪些伺服器元件定義了動態權限。對於 MySQL 發行版本,定義動態權限的元件文件會說明這些權限。

第三方元件也可能定義動態權限;管理員應了解這些權限,且不應安裝可能與伺服器運作衝突或損害伺服器運作的元件。例如,如果兩個元件都定義了同名的權限,則一個元件會與另一個元件衝突。元件開發人員可以透過選擇具有基於元件名稱的前置詞的權限名稱來降低這種情況發生的可能性。

伺服器會在內部記憶體中維護已註冊動態權限的集合。取消註冊會在伺服器關閉時發生。

通常,定義動態權限的元件會在安裝時(在其初始化順序期間)註冊它們。當解除安裝時,元件不會取消註冊其已註冊的動態權限。(這是目前的做法,而不是要求。也就是說,元件可以隨時取消註冊它們註冊的權限,但實際上並不會這樣做。)

嘗試註冊已註冊的動態權限時,不會發生警告或錯誤。請考慮以下陳述式順序

INSTALL COMPONENT 'my_component';
UNINSTALL COMPONENT 'my_component';
INSTALL COMPONENT 'my_component';

第一個 INSTALL COMPONENT 陳述式會註冊元件 my_component 定義的任何權限,但 UNINSTALL COMPONENT 不會取消註冊它們。對於第二個 INSTALL COMPONENT 陳述式,它註冊的元件權限會發現已註冊,但不會發生警告或錯誤。

動態權限僅適用於全域層級。伺服器會將動態權限目前指派給使用者帳戶的相關資訊儲存在 mysql.global_grants 系統表格中。

  • 伺服器會在伺服器啟動期間自動註冊 global_grants 中命名的權限(除非給定 --skip-grant-tables 選項)。

  • GRANTREVOKE 陳述式會修改 global_grants 的內容。

  • global_grants 中列出的動態權限指派是持續性的。它們不會在伺服器關閉時移除。

範例:以下陳述式將控制複本(包括群組複寫)和修改系統變數所需的權限授予使用者 u1

GRANT REPLICATION_SLAVE_ADMIN, GROUP_REPLICATION_ADMIN, BINLOG_ADMIN
ON *.* TO 'u1'@'localhost';

授予的動態權限會出現在 SHOW GRANTS 陳述式和 INFORMATION_SCHEMA USER_PRIVILEGES 表格的輸出中。

對於全域層級的 GRANTREVOKE,會針對目前已註冊的動態權限集檢查任何未被識別為靜態的具名權限,如果找到則會授予。否則,會發生錯誤,指出未知的權限識別碼。

對於 GRANTREVOKE,全域層級 ALL [PRIVILEGES] 的含義包括所有靜態全域權限,以及所有目前已註冊的動態權限。

  • 全域層級的 GRANT ALL 會授予所有靜態全域權限和所有目前已註冊的動態權限。GRANT 陳述式執行後註冊的動態權限不會追溯授予任何帳戶。

  • 全域層級的 REVOKE ALL 會撤銷所有已授予的靜態全域權限和所有已授予的動態權限。

  1. SELECT GRANTEE FROM INFORMATION_SCHEMA.USER_PRIVILEGES
    WHERE PRIVILEGE_TYPE = 'SUPER';
  2. GRANT BINLOG_ADMIN, SYSTEM_VARIABLES_ADMIN ON *.* TO 'u1'@'localhost';
    REVOKE SUPER ON *.* FROM 'u1'@'localhost';