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


MySQL 8.4 參考手冊  /  ...  /  ALTER USER 陳述式

15.7.1.1 ALTER USER 語句

ALTER USER [IF EXISTS]
    user [auth_option] [, user [auth_option]] ...
    [REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
    [WITH resource_option [resource_option] ...]
    [password_option | lock_option] ...
    [COMMENT 'comment_string' | ATTRIBUTE 'json_object']

ALTER USER [IF EXISTS]
    USER() user_func_auth_option

ALTER USER [IF EXISTS]
    user [registration_option]

ALTER USER [IF EXISTS]
    USER() [registration_option]

ALTER USER [IF EXISTS]
    user DEFAULT ROLE
    {NONE | ALL | role [, role ] ...}

user:
    (see Section 8.2.4, “Specifying Account Names”)

auth_option: {
    IDENTIFIED BY 'auth_string'
        [REPLACE 'current_auth_string']
        [RETAIN CURRENT PASSWORD]
  | IDENTIFIED BY RANDOM PASSWORD
        [REPLACE 'current_auth_string']
        [RETAIN CURRENT PASSWORD]
  | IDENTIFIED WITH auth_plugin
  | IDENTIFIED WITH auth_plugin BY 'auth_string'
        [REPLACE 'current_auth_string']
        [RETAIN CURRENT PASSWORD]
  | IDENTIFIED WITH auth_plugin BY RANDOM PASSWORD
        [REPLACE 'current_auth_string']
        [RETAIN CURRENT PASSWORD]
  | IDENTIFIED WITH auth_plugin AS 'auth_string'
  | DISCARD OLD PASSWORD
  | ADD factor factor_auth_option [ADD factor factor_auth_option]
  | MODIFY factor factor_auth_option [MODIFY factor factor_auth_option]
  | DROP factor [DROP factor]
}

user_func_auth_option: {
    IDENTIFIED BY 'auth_string'
        [REPLACE 'current_auth_string']
        [RETAIN CURRENT PASSWORD]
  | DISCARD OLD PASSWORD
}

factor_auth_option: {
    IDENTIFIED BY 'auth_string'
  | IDENTIFIED BY RANDOM PASSWORD
  | IDENTIFIED WITH auth_plugin BY 'auth_string'
  | IDENTIFIED WITH auth_plugin BY RANDOM PASSWORD
  | IDENTIFIED WITH auth_plugin AS 'auth_string'
}

registration_option: {
    factor INITIATE REGISTRATION
  | factor FINISH REGISTRATION SET CHALLENGE_RESPONSE AS 'auth_string'
  | factor UNREGISTER
}

factor: {2 | 3} FACTOR

tls_option: {
   SSL
 | X509
 | CIPHER 'cipher'
 | ISSUER 'issuer'
 | SUBJECT 'subject'
}

resource_option: {
    MAX_QUERIES_PER_HOUR count
  | MAX_UPDATES_PER_HOUR count
  | MAX_CONNECTIONS_PER_HOUR count
  | MAX_USER_CONNECTIONS count
}

password_option: {
    PASSWORD EXPIRE [DEFAULT | NEVER | INTERVAL N DAY]
  | PASSWORD HISTORY {DEFAULT | N}
  | PASSWORD REUSE INTERVAL {DEFAULT | N DAY}
  | PASSWORD REQUIRE CURRENT [DEFAULT | OPTIONAL]
  | FAILED_LOGIN_ATTEMPTS N
  | PASSWORD_LOCK_TIME {N | UNBOUNDED}
}

lock_option: {
    ACCOUNT LOCK
  | ACCOUNT UNLOCK
}

ALTER USER 語句用於修改 MySQL 帳戶。它允許修改現有帳戶的身份驗證、角色、SSL/TLS、資源限制、密碼管理、註解和屬性等屬性。它也可以用於鎖定和解鎖帳戶。

在大多數情況下,ALTER USER 需要全域的 CREATE USER 權限,或者 mysql 系統架構的 UPDATE 權限。例外情況如下:

  • 任何使用非匿名帳戶連接到伺服器的客戶端都可以更改該帳戶的密碼。(特別是,您可以更改自己的密碼。)要查看伺服器將您驗證為哪個帳戶,請調用 CURRENT_USER() 函數。

    SELECT CURRENT_USER();
  • 對於 DEFAULT ROLE 語法,ALTER USER 需要以下權限:

    • 設定其他使用者的預設角色需要全域的 CREATE USER 權限,或者 mysql.default_roles 系統表格的 UPDATE 權限。

    • 為自己設定預設角色不需要特殊權限,前提是您想要設為預設的角色已授予給您。

  • 修改第二密碼的語句需要以下權限:

    • 使用 ALTER USER 語句的 RETAIN CURRENT PASSWORDDISCARD OLD PASSWORD 子句時,需要 APPLICATION_PASSWORD_ADMIN 權限,這些語句適用於您自己的帳戶。操作您自己的第二密碼需要此權限,因為大多數使用者只需要一個密碼。

    • 如果要允許帳戶操作所有帳戶的第二密碼,它需要 CREATE USER 權限,而不是 APPLICATION_PASSWORD_ADMIN 權限。

當啟用 read_only 系統變數時,ALTER USER 還需要 CONNECTION_ADMIN 權限(或已棄用的 SUPER 權限)。

以下是其他權限的注意事項:

預設情況下,如果您嘗試修改不存在的使用者,則會發生錯誤。如果給定 IF EXISTS 子句,則語句會為每個不存在的指定使用者產生警告,而不是錯誤。

重要事項

在某些情況下,ALTER USER 可能會記錄在伺服器日誌中,或記錄在客戶端歷史記錄檔案中,例如 ~/.mysql_history,這表示任何具有該資訊讀取權限的人都可以讀取明文密碼。有關伺服器日誌中發生這種情況的條件以及如何控制它的資訊,請參閱 第 8.1.2.3 節,〈密碼和日誌記錄〉。有關用戶端日誌記錄的類似資訊,請參閱 第 6.5.1.3 節,〈mysql 用戶端日誌記錄〉

ALTER USER 語句有幾個方面,在以下主題中描述:

ALTER USER 概述

對於每個受影響的帳戶,ALTER USER 會修改 mysql.user 系統表格中對應的列,以反映語句中指定的屬性。未指定的屬性會保留其目前的值。

每個帳戶名稱都使用 第 8.2.4 節,〈指定帳戶名稱〉 中描述的格式。如果省略帳戶名稱的主機名稱部分,則預設為 '%'。也可以指定 CURRENT_USERCURRENT_USER() 來參照與目前工作階段關聯的帳戶。

只有在一個案例中,可以使用 USER() 函數指定帳戶:

ALTER USER USER() IDENTIFIED BY 'auth_string';

這種語法允許在不直接命名您的帳戶的情況下更改您自己的密碼。(此語法也支援 ALTER USER 身份驗證選項 中描述的 REPLACERETAIN CURRENT PASSWORDDISCARD OLD PASSWORD 子句。)

對於允許 auth_option 值緊隨 user 值之後的 ALTER USER 語法,auth_option 表示帳戶如何通過指定帳戶身份驗證外掛程式、憑證(例如,密碼)或兩者來驗證身份。每個 auth_option適用於緊接在其前面的帳戶名稱。

user 規格之後,語句可以包含 SSL/TLS、資源限制、密碼管理和鎖定屬性的選項。所有這些選項對於語句都是全域性的,並且適用於語句中命名的所有帳戶。

範例:更改帳戶的密碼並使其過期。因此,使用者必須使用指定的密碼連接,並在下次連接時選擇新的密碼:

ALTER USER 'jeffrey'@'localhost'
  IDENTIFIED BY 'new_password' PASSWORD EXPIRE;

範例:修改帳戶以使用 caching_sha2_password 身份驗證外掛程式和給定的密碼。要求每 180 天選擇一個新密碼,並啟用登入失敗追蹤,使得連續三個不正確的密碼會導致帳戶臨時鎖定兩天:

ALTER USER 'jeffrey'@'localhost'
  IDENTIFIED WITH caching_sha2_password BY 'new_password'
  PASSWORD EXPIRE INTERVAL 180 DAY
  FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 2;

範例:鎖定或解鎖帳戶:

ALTER USER 'jeffrey'@'localhost' ACCOUNT LOCK;
ALTER USER 'jeffrey'@'localhost' ACCOUNT UNLOCK;

範例:要求帳戶使用 SSL 連接,並設定每小時 20 個連線的限制:

ALTER USER 'jeffrey'@'localhost'
  REQUIRE SSL WITH MAX_CONNECTIONS_PER_HOUR 20;

範例:變更多個帳戶,指定一些按帳戶屬性和一些全域屬性:

ALTER USER
  'jeffrey'@'localhost'
    IDENTIFIED BY 'jeffrey_new_password',
  'jeanne'@'localhost',
  'josh'@'localhost'
    IDENTIFIED BY 'josh_new_password'
    REPLACE 'josh_current_password'
    RETAIN CURRENT PASSWORD
  REQUIRE SSL WITH MAX_USER_CONNECTIONS 2
  PASSWORD HISTORY 5;

jeffrey 後面的 IDENTIFIED BY 值僅適用於其緊接在前的帳戶,因此它僅針對 jeffrey 將密碼更改為 'jeffrey_new_password'。對於 jeanne,沒有每個帳戶的值(因此密碼保持不變)。對於 joshIDENTIFIED BY 會建立一個新密碼 ('josh_new_password'),指定 REPLACE 來驗證發出 ALTER USER 語句的使用者知道目前密碼 ('josh_current_password'),並且目前密碼也會保留為帳戶第二密碼。(因此,josh 可以使用主要密碼或第二密碼連接。)

其餘屬性全域適用於語句中命名的所有帳戶,因此對於這兩個帳戶:

  • 連線必須使用 SSL。

  • 該帳戶最多可同時用於兩個連線。

  • 密碼變更不能重複使用最近的五個密碼。

範例:放棄 josh 的第二密碼,使該帳戶僅保留其主要密碼:

ALTER USER 'josh'@'localhost' DISCARD OLD PASSWORD;

在沒有特定類型的選項的情況下,帳戶在該方面保持不變。例如,如果沒有鎖定選項,則帳戶的鎖定狀態不會變更。

ALTER USER 身份驗證選項

帳戶名稱後面可以接一個 auth_option 身份驗證選項,指定帳戶身份驗證外掛程式、憑證或兩者。它還可以包含一個密碼驗證子句,指定要替換的帳戶目前密碼,以及管理帳戶是否具有第二密碼的子句。

注意

用於隨機密碼產生、密碼驗證和第二密碼的子句僅適用於使用將憑證內部儲存到 MySQL 的身份驗證外掛程式的帳戶。對於使用針對 MySQL 外部憑證系統執行身份驗證的外掛程式的帳戶,也必須在外部針對該系統處理密碼管理。有關內部憑證儲存的詳細資訊,請參閱 第 8.2.15 節,〈密碼管理〉

  • auth_plugin 命名一個身份驗證外掛程式。外掛程式名稱可以是帶引號的字串常值或不帶引號的名稱。外掛程式名稱儲存在 mysql.user 系統表格的 plugin 列中。

    對於未指定身份驗證外掛程式的 auth_option 語法,伺服器會指派預設外掛程式,如 預設身份驗證外掛程式 中所述判斷。有關每個外掛程式的說明,請參閱 第 8.4.1 節,〈身份驗證外掛程式〉

  • 內部儲存的憑證會儲存在 mysql.user 系統表格中。'auth_string' 值或 RANDOM PASSWORD 會指定帳戶憑證,分別以明文(未加密)字串或以與帳戶關聯的身份驗證外掛程式預期的格式雜湊。

    • 對於使用 BY 'auth_string' 語法的狀況,該字串為明文,並會傳遞給身份驗證外掛程式以進行可能的雜湊處理。外掛程式返回的結果會儲存在 mysql.user 資料表中。外掛程式可能會直接使用指定的值,在這種情況下不會進行雜湊處理。

    • 對於使用 BY RANDOM PASSWORD 語法的狀況,MySQL 會產生一個隨機密碼,並以明文形式傳遞給身份驗證外掛程式以進行可能的雜湊處理。外掛程式返回的結果會儲存在 mysql.user 資料表中。外掛程式可能會直接使用指定的值,在這種情況下不會進行雜湊處理。

      隨機產生的密碼具有隨機密碼產生中描述的特性。

    • 對於使用 AS 'auth_string' 語法的狀況,假設該字串已為身份驗證外掛程式要求的格式,並會原樣儲存在 mysql.user 資料表中。如果外掛程式需要雜湊值,該值必須已雜湊為適合該外掛程式的格式;否則,該值將無法被外掛程式使用,且用戶端連線的正確身份驗證將無法發生。

      雜湊字串可以是字串文字或十六進位值。後者對應於當啟用 print_identified_with_as_hex 系統變數時,SHOW CREATE USER 為包含無法列印字元的密碼雜湊所顯示的值類型。

    • 如果身份驗證外掛程式不對身份驗證字串進行雜湊處理,則 BY 'auth_string'AS 'auth_string' 子句具有相同的效果:身份驗證字串會原樣儲存在 mysql.user 系統資料表中。

  • REPLACE 'current_auth_string' 子句會執行密碼驗證。如果給定

    • REPLACE 會指定要替換的帳戶目前密碼,以明文(未加密)字串的形式。

    • 如果要求帳戶的密碼變更指定目前密碼,則必須給定該子句,以驗證嘗試進行變更的使用者是否確實知道目前密碼。

    • 如果帳戶的密碼變更可以但不需要指定目前密碼,則該子句為可選的。

    • 即使該子句為可選的,如果給定該子句但與目前密碼不符,則陳述式將會失敗。

    • REPLACE 只能在變更目前使用者的帳戶密碼時指定。

    如需有關透過指定目前密碼進行密碼驗證的詳細資訊,請參閱第 8.2.15 節:「密碼管理」

  • RETAIN CURRENT PASSWORDDISCARD OLD PASSWORD 子句會實作雙密碼功能。兩者都是可選的,但如果給定,則會產生以下效果:

    • RETAIN CURRENT PASSWORD 會將帳戶目前的密碼保留為其次要密碼,並替換任何現有的次要密碼。新密碼會變成主要密碼,但用戶端可以使用該帳戶透過主要或次要密碼連線到伺服器。(例外情況:如果 ALTER USER 陳述式指定的新密碼為空,即使給定 RETAIN CURRENT PASSWORD,次要密碼也會變成空。)

    • 如果您為主要密碼為空的帳戶指定 RETAIN CURRENT PASSWORD,則陳述式會失敗。

    • 如果帳戶具有次要密碼,且您在未指定 RETAIN CURRENT PASSWORD 的情況下變更其主要密碼,則次要密碼會保持不變。

    • 如果您變更指派給帳戶的身份驗證外掛程式,則會捨棄次要密碼。如果您變更身份驗證外掛程式,並且也指定 RETAIN CURRENT PASSWORD,則陳述式會失敗。

    • DISCARD OLD PASSWORD 會捨棄次要密碼(如果存在)。該帳戶只會保留其主要密碼,且用戶端只能使用主要密碼連線到伺服器。

    如需有關使用雙密碼的詳細資訊,請參閱第 8.2.15 節:「密碼管理」

ALTER USER 允許這些 auth_option 語法:

  • IDENTIFIED BY 'auth_string' [REPLACE 'current_auth_string'] [RETAIN CURRENT PASSWORD]

    將帳戶身份驗證外掛程式設定為預設外掛程式,將明文 'auth_string' 值傳遞給外掛程式以進行可能的雜湊處理,並將結果儲存在 mysql.user 系統資料表中帳戶列中。

    如果給定 REPLACE 子句,則會指定帳戶目前密碼,如本節先前所述。

    如果給定 RETAIN CURRENT PASSWORD 子句,則會導致帳戶目前密碼保留為其次要密碼,如本節先前所述。

  • IDENTIFIED BY RANDOM PASSWORD [REPLACE 'current_auth_string'] [RETAIN CURRENT PASSWORD]

    將帳戶身份驗證外掛程式設定為預設外掛程式,產生隨機密碼,將明文密碼值傳遞給外掛程式以進行可能的雜湊處理,並將結果儲存在 mysql.user 系統資料表中帳戶列中。陳述式也會在結果集中傳回明文密碼,使其可供執行陳述式的使用者或應用程式使用。如需有關結果集和隨機產生密碼特性的詳細資訊,請參閱隨機密碼產生

    如果給定 REPLACE 子句,則會指定帳戶目前密碼,如本節先前所述。

    如果給定 RETAIN CURRENT PASSWORD 子句,則會導致帳戶目前密碼保留為其次要密碼,如本節先前所述。

  • IDENTIFIED WITH auth_plugin

    將帳戶身份驗證外掛程式設定為 auth_plugin,將認證清除為空字串(認證會與舊的身份驗證外掛程式相關聯,而不是新的外掛程式),並將結果儲存在 mysql.user 系統資料表中帳戶列中。

    此外,密碼會標示為已過期。使用者下次連線時必須選擇新的密碼。

  • IDENTIFIED WITH auth_plugin BY 'auth_string' [REPLACE 'current_auth_string'] [RETAIN CURRENT PASSWORD]

    將帳戶身份驗證外掛程式設定為 auth_plugin,將明文 'auth_string' 值傳遞給外掛程式以進行可能的雜湊處理,並將結果儲存在 mysql.user 系統資料表中帳戶列中。

    如果給定 REPLACE 子句,則會指定帳戶目前密碼,如本節先前所述。

    如果給定 RETAIN CURRENT PASSWORD 子句,則會導致帳戶目前密碼保留為其次要密碼,如本節先前所述。

  • IDENTIFIED WITH auth_plugin BY RANDOM PASSWORD [REPLACE 'current_auth_string'] [RETAIN CURRENT PASSWORD]

    將帳戶身份驗證外掛程式設定為 auth_plugin,產生隨機密碼,將明文密碼值傳遞給外掛程式以進行可能的雜湊處理,並將結果儲存在 mysql.user 系統資料表中帳戶列中。陳述式也會在結果集中傳回明文密碼,使其可供執行陳述式的使用者或應用程式使用。如需有關結果集和隨機產生密碼特性的詳細資訊,請參閱隨機密碼產生

    如果給定 REPLACE 子句,則會指定帳戶目前密碼,如本節先前所述。

    如果給定 RETAIN CURRENT PASSWORD 子句,則會導致帳戶目前密碼保留為其次要密碼,如本節先前所述。

  • IDENTIFIED WITH auth_plugin AS 'auth_string'

    將帳戶身份驗證外掛程式設定為 auth_plugin,並將 'auth_string' 值原樣儲存在 mysql.user 帳戶列中。如果外掛程式需要雜湊字串,則假設該字串已雜湊為外掛程式要求的格式。

  • DISCARD OLD PASSWORD

    如本節先前所述,捨棄帳戶次要密碼(如果有的話)。

範例:以明文指定密碼;使用預設外掛程式

ALTER USER 'jeffrey'@'localhost'
  IDENTIFIED BY 'password';

範例:指定身份驗證外掛程式,以及明文密碼值

ALTER USER 'jeffrey'@'localhost'
  IDENTIFIED WITH mysql_native_password
             BY 'password';

範例:與前一個範例類似,但此外,將目前密碼指定為明文值,以滿足任何帳戶要求,即進行變更的使用者知道該密碼

ALTER USER 'jeffrey'@'localhost'
  IDENTIFIED WITH mysql_native_password
             BY 'password'
             REPLACE 'current_password';

除非目前使用者為 jeffrey,否則前述陳述式會失敗,因為 REPLACE 只允許用於變更目前使用者的密碼。

範例:建立新的主要密碼,並將現有密碼保留為次要密碼

ALTER USER 'jeffrey'@'localhost'
  IDENTIFIED BY 'new_password'
  RETAIN CURRENT PASSWORD;

範例:捨棄次要密碼,使帳戶只保留其主要密碼

ALTER USER 'jeffery'@'localhost' DISCARD OLD PASSWORD;

範例:指定身份驗證外掛程式,以及雜湊密碼值

ALTER USER 'jeffrey'@'localhost'
  IDENTIFIED WITH mysql_native_password
             AS '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4';

如需有關設定密碼和身份驗證外掛程式的更多資訊,請參閱第 8.2.14 節:「指派帳戶密碼」第 8.2.17 節:「可外掛的身份驗證」

ALTER USER 多因素身份驗證選項

ALTER USER 具有 ADDMODIFYDROP 子句,可讓您新增、修改或捨棄身份驗證因素。在每種情況下,子句都會指定要對一個身份驗證因素執行的操作,並選擇性地指定對另一個身份驗證因素執行的操作。對於每個操作,factor 項目會指定 FACTOR 關鍵字,前面加上數字 2 或 3,以表示操作是否適用於第二個或第三個身份驗證因素。(在此內容中不允許 1。若要對第一個身份驗證因素執行操作,請使用ALTER USER 身份驗證選項中描述的語法。)

ALTER USER 多因素身份驗證子句限制由 authentication_policy 系統變數定義。例如,authentication_policy 設定控制帳戶可能擁有的身份驗證因素數量,以及每個因素允許的身份驗證方法。請參閱設定多因素身份驗證原則

ALTER USER 在單一陳述式中新增、修改或捨棄第二和第三個因素時,操作會依序執行,但如果序列中的任何操作失敗,則整個 ALTER USER 陳述式都會失敗。

對於 ADD,每個命名的因素都不得已存在,否則無法新增。對於 MODIFYDROP,每個命名的因素都必須存在才能修改或捨棄。如果定義了第二和第三個因素,則捨棄第二個因素會導致第三個因素取代其作為第二個因素的位置。

此陳述式會捨棄身份驗證因素 2 和 3,其效果是將帳戶從 3FA 轉換為 1FA

ALTER USER 'user' DROP 2 FACTOR 3 FACTOR;

如需其他 ADDMODIFYDROP 範例,請參閱開始使用多因素身份驗證

如需有關因素特定規則的資訊,這些規則會判斷未命名外掛程式的身份驗證子句的預設身份驗證外掛程式,請參閱預設身份驗證外掛程式

ALTER USER 註冊選項

ALTER USER 具有可註冊和取消註冊 FIDO/FIDO2 裝置的子句。如需更多資訊,請參閱使用 WebAuthn 驗證WebAuthn 的裝置取消註冊,以及 mysql 用戶端的 --register-factor 選項說明。

用於 FIDO/FIDO2 裝置註冊的 mysql 用戶端 --register-factor 選項,會使 mysql 用戶端產生並執行 INITIATE REGISTRATIONFINISH REGISTRATION 陳述式。這些陳述式不適用於手動執行。

ALTER USER 角色選項

ALTER USER ... DEFAULT ROLE 定義了當使用者連線到伺服器並驗證身分時,或當使用者在工作階段期間執行 SET ROLE DEFAULT 陳述式時,哪些角色會變為作用中狀態。

ALTER USER ... DEFAULT ROLESET DEFAULT ROLE 的替代語法 (請參閱第 15.7.1.9 節,〈SET DEFAULT ROLE 陳述式〉)。然而,ALTER USER 只能為單一使用者設定預設值,而 SET DEFAULT ROLE 可以為多個使用者設定預設值。另一方面,您可以為 ALTER USER 陳述式指定 CURRENT_USER 作為使用者名稱,但您不能對 SET DEFAULT ROLE 這麼做。

每個使用者帳戶名稱都使用先前描述的格式。

每個角色名稱都使用第 8.2.5 節,〈指定角色名稱〉中描述的格式。例如

ALTER USER 'joe'@'10.0.0.1' DEFAULT ROLE administrator, developer;

如果省略角色名稱的主機名稱部分,則預設為 '%'

DEFAULT ROLE 關鍵字後面的子句允許以下值

  • NONE:將預設值設定為 NONE(沒有角色)。

  • ALL:將預設值設定為授予帳戶的所有角色。

  • role [, role ] ...:將預設值設定為指定的角色,這些角色必須在執行 ALTER USER ... DEFAULT ROLE 時存在並授予給該帳戶。

ALTER USER SSL/TLS 選項

除了基於使用者名稱和憑證的常用驗證之外,MySQL 還可以檢查 X.509 憑證屬性。如需有關將 SSL/TLS 與 MySQL 搭配使用的背景資訊,請參閱第 8.3 節,〈使用加密連線〉

若要為 MySQL 帳戶指定與 SSL/TLS 相關的選項,請使用指定一個或多個 tls_option 值的 REQUIRE 子句。

REQUIRE 選項的順序無關緊要,但不能重複指定任何選項。REQUIRE 選項之間使用 AND 關鍵字是可選的。

ALTER USER 允許使用這些 tls_option

  • NONE

    表示陳述式所命名的所有帳戶都沒有 SSL 或 X.509 要求。如果使用者名稱和密碼有效,則允許未加密的連線。如果用戶端具有適當的憑證和金鑰檔案,則可以在用戶端選擇的情況下使用加密連線。

    ALTER USER 'jeffrey'@'localhost' REQUIRE NONE;

    預設情況下,用戶端會嘗試建立安全連線。對於具有 REQUIRE NONE 的用戶端,如果無法建立安全連線,則連線嘗試會回復為未加密的連線。若要要求加密連線,用戶端只需指定 --ssl-mode=REQUIRED 選項即可;如果無法建立安全連線,則連線嘗試會失敗。

  • SSL

    告訴伺服器只允許陳述式所命名的所有帳戶使用加密連線。

    ALTER USER 'jeffrey'@'localhost' REQUIRE SSL;

    預設情況下,用戶端會嘗試建立安全連線。對於具有 REQUIRE SSL 的帳戶,如果無法建立安全連線,則連線嘗試會失敗。

  • X509

    對於陳述式所命名的所有帳戶,要求用戶端提供有效的憑證,但確切的憑證、發行者和主體並不重要。唯一的要求是應該可以使用其中一個 CA 憑證來驗證其簽名。使用 X.509 憑證始終表示加密,因此在這種情況下,SSL 選項是不必要的。

    ALTER USER 'jeffrey'@'localhost' REQUIRE X509;

    對於具有 REQUIRE X509 的帳戶,用戶端必須指定 --ssl-key--ssl-cert 選項才能連線。(建議但不要求也指定 --ssl-ca,以便可以驗證伺服器提供的公用憑證。)ISSUERSUBJECT 也一樣,因為這些 REQUIRE 選項表示 X509 的要求。

  • ISSUER 'issuer'

    對於陳述式所命名的所有帳戶,要求用戶端提供由 CA 'issuer' 發行的有效 X.509 憑證。如果用戶端提供的憑證有效,但發行者不同,則伺服器會拒絕連線。使用 X.509 憑證始終表示加密,因此在這種情況下,SSL 選項是不必要的。

    ALTER USER 'jeffrey'@'localhost'
      REQUIRE ISSUER '/C=SE/ST=Stockholm/L=Stockholm/
        O=MySQL/CN=CA/emailAddress=ca@example.com';

    由於 ISSUER 表示 X509 的要求,因此用戶端必須指定 --ssl-key--ssl-cert 選項才能連線。(建議但不要求也指定 --ssl-ca,以便可以驗證伺服器提供的公用憑證。)

  • SUBJECT 'subject'

    對於陳述式所命名的所有帳戶,要求用戶端提供包含主體 subject 的有效 X.509 憑證。如果用戶端提供的憑證有效,但主體不同,則伺服器會拒絕連線。使用 X.509 憑證始終表示加密,因此在這種情況下,SSL 選項是不必要的。

    ALTER USER 'jeffrey'@'localhost'
      REQUIRE SUBJECT '/C=SE/ST=Stockholm/L=Stockholm/
        O=MySQL demo client certificate/
        CN=client/emailAddress=client@example.com';

    MySQL 會對 'subject' 值與憑證中的值進行簡單的字串比較,因此字母大小寫和元件順序必須與憑證中存在的完全一致。

    由於 SUBJECT 表示 X509 的要求,因此用戶端必須指定 --ssl-key--ssl-cert 選項才能連線。(建議但不要求也指定 --ssl-ca,以便可以驗證伺服器提供的公用憑證。)

  • CIPHER 'cipher'

    對於陳述式所命名的所有帳戶,要求使用特定的加密方法來加密連線。需要此選項才能確保使用足夠強度的密碼和金鑰長度。如果使用採用短加密金鑰的舊演算法,則加密可能很弱。

    ALTER USER 'jeffrey'@'localhost'
      REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA';

SUBJECTISSUERCIPHER 選項可以在 REQUIRE 子句中組合使用

ALTER USER 'jeffrey'@'localhost'
  REQUIRE SUBJECT '/C=SE/ST=Stockholm/L=Stockholm/
    O=MySQL demo client certificate/
    CN=client/emailAddress=client@example.com'
  AND ISSUER '/C=SE/ST=Stockholm/L=Stockholm/
    O=MySQL/CN=CA/emailAddress=ca@example.com'
  AND CIPHER 'EDH-RSA-DES-CBC3-SHA';
ALTER USER 資源限制選項

可以對帳戶使用伺服器資源設定限制,如第 8.2.21 節,〈設定帳戶資源限制〉中所述。若要執行此操作,請使用指定一個或多個 resource_option 值的 WITH 子句。

WITH 選項的順序無關緊要,但如果多次指定給定的資源限制,則最後一個執行個體優先。

ALTER USER 允許使用這些 resource_option

  • MAX_QUERIES_PER_HOUR countMAX_UPDATES_PER_HOUR countMAX_CONNECTIONS_PER_HOUR count

    對於陳述式所命名的所有帳戶,這些選項會限制每個帳戶在任何給定的一小時期間內可以執行多少個查詢、更新和連線到伺服器。如果 count0(預設值),則表示該帳戶沒有限制。

  • MAX_USER_CONNECTIONS count

    對於語句中指定的所有帳戶,限制每個帳戶同時連線到伺服器的最大數量。非零的 count 值明確指定該帳戶的限制。如果 count0(預設值),伺服器會根據 max_user_connections 系統變數的全域值來決定該帳戶的同時連線數量。如果 max_user_connections 也為零,則該帳戶沒有限制。

範例

ALTER USER 'jeffrey'@'localhost'
  WITH MAX_QUERIES_PER_HOUR 500 MAX_UPDATES_PER_HOUR 100;
ALTER USER 密碼管理選項

ALTER USER 支援多個用於密碼管理的 password_option 值。

  • 密碼過期選項:您可以手動使帳戶密碼過期,並建立其密碼過期策略。策略選項不會使密碼過期。相反地,它們會決定伺服器如何根據密碼的期限,自動對帳戶應用過期機制,而密碼期限是從最近一次變更帳戶密碼的日期和時間開始評估的。

  • 密碼重複使用選項:您可以根據密碼變更次數、經過的時間或兩者來限制密碼的重複使用。

  • 密碼驗證要求選項:您可以指出變更帳戶密碼的嘗試是否必須指定當前密碼,以驗證嘗試進行變更的使用者實際上知道當前密碼。

  • 錯誤密碼登入失敗追蹤選項:您可以使伺服器追蹤登入失敗的嘗試,並暫時鎖定連續輸入太多次錯誤密碼的帳戶。所需的失敗次數和鎖定時間是可設定的。

本節介紹密碼管理選項的語法。有關建立密碼管理策略的資訊,請參閱第 8.2.15 節「密碼管理」

如果指定了多個給定類型的密碼管理選項,則最後一個選項優先。例如,PASSWORD EXPIRE DEFAULT PASSWORD EXPIRE NEVERPASSWORD EXPIRE NEVER 相同。

注意

除了與登入失敗追蹤相關的選項外,密碼管理選項僅適用於使用將憑證內部儲存到 MySQL 的身份驗證外掛程式的帳戶。對於使用針對 MySQL 外部的憑證系統執行身份驗證的外掛程式的帳戶,密碼管理也必須在外部針對該系統進行處理。有關內部憑證儲存的更多資訊,請參閱第 8.2.15 節「密碼管理」

如果帳戶密碼是手動過期,或者根據自動過期策略,密碼期限被認為大於其允許的生命週期,則用戶端的密碼會過期。在這種情況下,伺服器會斷開用戶端的連線,或限制允許其執行的操作(請參閱第 8.2.16 節「過期密碼的伺服器處理」)。受限用戶端執行的操作會導致錯誤,直到使用者建立新的帳戶密碼為止。

注意

儘管可以通過將過期的密碼設定為當前值來「重設」,但作為良好的策略,最好選擇不同的密碼。DBA 可以通過建立適當的密碼重複使用策略來強制禁止重複使用。請參閱密碼重複使用策略

ALTER USER 允許使用這些 password_option 值來控制密碼過期

  • PASSWORD EXPIRE

    立即將語句中指定的所有帳戶的密碼標記為過期。

    ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE;
  • PASSWORD EXPIRE DEFAULT

    將語句中指定的所有帳戶設定為套用全域過期策略,如 default_password_lifetime 系統變數所指定。

    ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE DEFAULT;
  • PASSWORD EXPIRE NEVER

    此過期選項會覆寫語句中指定的所有帳戶的全域策略。對於每個帳戶,它會停用密碼過期,使密碼永遠不會過期。

    ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE NEVER;
  • PASSWORD EXPIRE INTERVAL N DAY

    此過期選項會覆寫語句中指定的所有帳戶的全域策略。對於每個帳戶,它將密碼生命週期設定為 N 天。以下語句要求每 180 天變更一次密碼

    ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 180 DAY;

ALTER USER 允許使用這些 password_option 值來根據所需的最小密碼變更次數來控制先前密碼的重複使用

  • PASSWORD HISTORY DEFAULT

    將語句中指定的所有帳戶設定為套用關於密碼歷程長度的全域策略,以禁止重複使用在 password_history 系統變數所指定變更次數之前的密碼。

    ALTER USER 'jeffrey'@'localhost' PASSWORD HISTORY DEFAULT;
  • PASSWORD HISTORY N

    此歷程長度選項會覆寫語句中指定的所有帳戶的全域策略。對於每個帳戶,它將密碼歷程長度設定為 N 個密碼,以禁止重複使用最近選擇的 N 個密碼中的任何一個。以下語句禁止重複使用先前 6 個密碼中的任何一個

    ALTER USER 'jeffrey'@'localhost' PASSWORD HISTORY 6;

ALTER USER 允許使用這些 password_option 值來根據經過的時間來控制先前密碼的重複使用

  • PASSWORD REUSE INTERVAL DEFAULT

    將帳戶指定的語句設定為套用關於經過時間的全域策略,以禁止重複使用比 password_reuse_interval 系統變數所指定的天數更新的密碼。

    ALTER USER 'jeffrey'@'localhost' PASSWORD REUSE INTERVAL DEFAULT;
  • PASSWORD REUSE INTERVAL N DAY

    此經過時間選項會覆寫語句中指定的所有帳戶的全域策略。對於每個帳戶,它將密碼重複使用間隔設定為 N 天,以禁止重複使用比該天數更新的密碼。以下語句禁止重複使用密碼 360 天

    ALTER USER 'jeffrey'@'localhost' PASSWORD REUSE INTERVAL 360 DAY;

ALTER USER 允許使用這些 password_option 值來控制嘗試變更帳戶密碼是否必須指定當前密碼,以驗證嘗試進行變更的使用者實際上知道當前密碼

  • PASSWORD REQUIRE CURRENT

    此驗證選項會覆寫語句中指定的所有帳戶的全域策略。對於每個帳戶,它要求密碼變更指定當前密碼。

    ALTER USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT;
  • PASSWORD REQUIRE CURRENT OPTIONAL

    此驗證選項會覆寫語句中指定的所有帳戶的全域策略。對於每個帳戶,它不要求密碼變更指定當前密碼。(可以給出當前密碼,但不必給出。)

    ALTER USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT OPTIONAL;
  • PASSWORD REQUIRE CURRENT DEFAULT

    將帳戶指定的語句設定為套用關於密碼驗證的全域策略,如 password_require_current 系統變數所指定。

    ALTER USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT DEFAULT;

ALTER USER 允許使用這些 password_option 值來控制登入失敗追蹤

  • FAILED_LOGIN_ATTEMPTS N

    是否追蹤指定錯誤密碼的帳戶登入嘗試。N 必須是 0 到 32767 之間的數字。值 0 會停用登入失敗追蹤。大於 0 的值表示有多少次連續密碼失敗會導致帳戶暫時鎖定(如果 PASSWORD_LOCK_TIME 也為非零值)。

  • PASSWORD_LOCK_TIME {N | UNBOUNDED}

    在連續登入嘗試提供太多次錯誤密碼後,鎖定帳戶的時間長度。N 必須是 0 到 32767 之間的數字,或 UNBOUNDED。值 0 會停用帳戶暫時鎖定。大於 0 的值表示鎖定帳戶的天數。值 UNBOUNDED 會使帳戶鎖定時間不受限制;一旦鎖定,帳戶將保持鎖定狀態,直到解鎖為止。有關解鎖發生條件的資訊,請參閱登入失敗追蹤和帳戶暫時鎖定

要使登入失敗追蹤和暫時鎖定生效,帳戶的 FAILED_LOGIN_ATTEMPTSPASSWORD_LOCK_TIME 選項都必須為非零值。以下語句修改帳戶,使其在連續密碼失敗四次後保持鎖定兩天

ALTER USER 'jeffrey'@'localhost'
  FAILED_LOGIN_ATTEMPTS 4 PASSWORD_LOCK_TIME 2;
ALTER USER 註解和屬性選項

MySQL 8.4 支援使用者註解和使用者屬性,如第 15.7.1.3 節「CREATE USER Statement」中所述。這些可以使用 ALTER USER 通過 COMMENTATTRIBUTE 選項分別進行修改。您不能在同一個 ALTER USER 語句中同時指定這兩個選項;嘗試這樣做會導致語法錯誤。

使用者註解和使用者屬性會以 JSON 物件的形式儲存在資訊綱要 USER_ATTRIBUTES 表格中;使用者註解會儲存在此表格的 ATTRIBUTE 欄位中,作為 comment 鍵的值,如稍後討論所示。COMMENT 文字可以是任何以引號括住的文字,並會取代任何現有的使用者註解。ATTRIBUTE 值必須是 JSON 物件的有效字串表示。這會與任何現有的使用者屬性合併,就像對現有使用者屬性和新的使用者屬性使用了 JSON_MERGE_PATCH() 函數一樣;對於任何重複使用的鍵,新值會覆蓋舊值,如下所示

mysql> SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
    ->     WHERE USER='bill' AND HOST='localhost';
+------+-----------+----------------+
| USER | HOST      | ATTRIBUTE      |
+------+-----------+----------------+
| bill | localhost | {"foo": "bar"} |
+------+-----------+----------------+
1 row in set (0.11 sec)

mysql> ALTER USER 'bill'@'localhost' ATTRIBUTE '{"baz": "faz", "foo": "moo"}';
Query OK, 0 rows affected (0.22 sec)

mysql> SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
    ->     WHERE USER='bill' AND HOST='localhost';
+------+-----------+------------------------------+
| USER | HOST      | ATTRIBUTE                    |
+------+-----------+------------------------------+
| bill | localhost | {"baz": "faz", "foo": "moo"} |
+------+-----------+------------------------------+
1 row in set (0.00 sec)

若要從使用者屬性中移除鍵及其值,請將該鍵設定為 JSON null(必須為小寫且不加引號),如下所示

mysql> ALTER USER 'bill'@'localhost' ATTRIBUTE '{"foo": null}';
Query OK, 0 rows affected (0.08 sec)

mysql> SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
    ->     WHERE USER='bill' AND HOST='localhost';
+------+-----------+----------------+
| USER | HOST      | ATTRIBUTE      |
+------+-----------+----------------+
| bill | localhost | {"baz": "faz"} |
+------+-----------+----------------+
1 row in set (0.00 sec)

若要將現有的使用者註解設定為空字串,請使用 ALTER USER ... COMMENT ''。這會在 USER_ATTRIBUTES 表格中留下一個空的 comment 值;若要完全移除使用者註解,請使用 ALTER USER ... ATTRIBUTE ...,並將欄位鍵的值設定為 JSON null(不加引號,小寫)。以下 SQL 語句序列說明了這一點

mysql> ALTER USER 'bill'@'localhost' COMMENT 'Something about Bill';
Query OK, 0 rows affected (0.06 sec)

mysql> SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
    ->     WHERE USER='bill' AND HOST='localhost';
+------+-----------+---------------------------------------------------+
| USER | HOST      | ATTRIBUTE                                         |
+------+-----------+---------------------------------------------------+
| bill | localhost | {"baz": "faz", "comment": "Something about Bill"} |
+------+-----------+---------------------------------------------------+
1 row in set (0.00 sec)

mysql> ALTER USER 'bill'@'localhost' COMMENT '';
Query OK, 0 rows affected (0.09 sec)

mysql> SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
    ->     WHERE USER='bill' AND HOST='localhost';
+------+-----------+-------------------------------+
| USER | HOST      | ATTRIBUTE                     |
+------+-----------+-------------------------------+
| bill | localhost | {"baz": "faz", "comment": ""} |
+------+-----------+-------------------------------+
1 row in set (0.00 sec)

mysql> ALTER USER 'bill'@'localhost' ATTRIBUTE '{"comment": null}';
Query OK, 0 rows affected (0.07 sec)

mysql> SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
    ->     WHERE USER='bill' AND HOST='localhost';
+------+-----------+----------------+
| USER | HOST      | ATTRIBUTE      |
+------+-----------+----------------+
| bill | localhost | {"baz": "faz"} |
+------+-----------+----------------+
1 row in set (0.00 sec)
ALTER USER 帳戶鎖定選項

MySQL 支援使用 ACCOUNT LOCKACCOUNT UNLOCK 選項來鎖定和解鎖帳戶,這些選項指定帳戶的鎖定狀態。如需更多討論,請參閱第 8.2.20 節「帳戶鎖定」

如果指定了多個帳戶鎖定選項,則最後一個選項優先。

ALTER USER ... ACCOUNT UNLOCK 會解鎖任何因登入失敗次數過多而暫時鎖定的語句所命名的帳戶。請參閱第 8.2.15 節「密碼管理」

ALTER USER 二進制日誌

如果 ALTER USER 成功,則會寫入二進制日誌,但如果失敗則不會寫入;在這種情況下,會發生回滾且不會進行任何變更。寫入二進制日誌的語句包含所有命名的使用者。如果給定了 IF EXISTS 子句,則這甚至包括不存在且未被修改的使用者。

如果原始語句變更了使用者的憑證,則寫入二進制日誌的語句會指定該使用者適用的身份驗證外掛程式,判斷方式如下

  • 如果指定了外掛程式,則為原始語句中命名的外掛程式。

  • 否則,如果使用者存在,則為與使用者帳戶關聯的外掛程式,如果使用者不存在,則為預設的身份驗證外掛程式。(如果寫入二進制日誌的語句必須為使用者指定特定的身份驗證外掛程式,請將其包含在原始語句中。)

如果伺服器為寫入二進制日誌的語句中的任何使用者新增了預設的身份驗證外掛程式,則會將警告寫入錯誤日誌,並命名這些使用者。

如果原始語句指定了 FAILED_LOGIN_ATTEMPTSPASSWORD_LOCK_TIME 選項,則寫入二進制日誌的語句會包含該選項。

支援多因素身份驗證 (MFA) 的子句的 ALTER USER 語句會寫入二進制日誌,但 ALTER USER user factor INITIATE REGISTRATION 語句除外。

  • ALTER USER user factor FINISH REGISTRATION SET CHALLENGE_RESPONSE AS 'auth_string' 語句會以 ALTER USER user MODIFY factor IDENTIFIED WITH authentication_webauthn AS webauthn_hash_string 的形式寫入二進制日誌;

  • 在複寫環境中,複寫使用者需要 PASSWORDLESS_USER_ADMIN 權限才能對使用 authentication_webauthn 外掛程式設定為無密碼身份驗證的帳戶執行 ALTER USER ... MODIFY 操作。