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 PASSWORD
或DISCARD OLD PASSWORD
子句時,需要APPLICATION_PASSWORD_ADMIN
權限,這些語句適用於您自己的帳戶。操作您自己的第二密碼需要此權限,因為大多數使用者只需要一個密碼。如果要允許帳戶操作所有帳戶的第二密碼,它需要
CREATE USER
權限,而不是APPLICATION_PASSWORD_ADMIN
權限。
當啟用 read_only
系統變數時,ALTER USER
還需要 CONNECTION_ADMIN
權限(或已棄用的 SUPER
權限)。
以下是其他權限的注意事項:
authentication_policy
系統變數對ALTER USER
語句中與身份驗證相關的子句的使用方式施加了某些限制;有關詳細資訊,請參閱該變數的說明。如果您擁有AUTHENTICATION_POLICY_ADMIN
權限,則這些限制不適用。要修改使用無密碼驗證的帳戶,您必須擁有
PASSWORDLESS_USER_ADMIN
權限。
預設情況下,如果您嘗試修改不存在的使用者,則會發生錯誤。如果給定 IF EXISTS
子句,則語句會為每個不存在的指定使用者產生警告,而不是錯誤。
在某些情況下,ALTER USER
可能會記錄在伺服器日誌中,或記錄在客戶端歷史記錄檔案中,例如 ~/.mysql_history
,這表示任何具有該資訊讀取權限的人都可以讀取明文密碼。有關伺服器日誌中發生這種情況的條件以及如何控制它的資訊,請參閱 第 8.1.2.3 節,〈密碼和日誌記錄〉。有關用戶端日誌記錄的類似資訊,請參閱 第 6.5.1.3 節,〈mysql 用戶端日誌記錄〉。
ALTER USER
語句有幾個方面,在以下主題中描述:
對於每個受影響的帳戶,ALTER USER
會修改 mysql.user
系統表格中對應的列,以反映語句中指定的屬性。未指定的屬性會保留其目前的值。
每個帳戶名稱都使用 第 8.2.4 節,〈指定帳戶名稱〉 中描述的格式。如果省略帳戶名稱的主機名稱部分,則預設為 '%'
。也可以指定 CURRENT_USER
或 CURRENT_USER()
來參照與目前工作階段關聯的帳戶。
只有在一個案例中,可以使用 USER()
函數指定帳戶:
ALTER USER USER() IDENTIFIED BY 'auth_string';
這種語法允許在不直接命名您的帳戶的情況下更改您自己的密碼。(此語法也支援 ALTER USER 身份驗證選項 中描述的 REPLACE
、RETAIN CURRENT PASSWORD
和 DISCARD 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
,沒有每個帳戶的值(因此密碼保持不變)。對於 josh
,IDENTIFIED BY
會建立一個新密碼 ('
),指定 josh_new_password
'REPLACE
來驗證發出 ALTER USER
語句的使用者知道目前密碼 ('
),並且目前密碼也會保留為帳戶第二密碼。(因此,josh_current_password
'josh
可以使用主要密碼或第二密碼連接。)
其餘屬性全域適用於語句中命名的所有帳戶,因此對於這兩個帳戶:
連線必須使用 SSL。
該帳戶最多可同時用於兩個連線。
密碼變更不能重複使用最近的五個密碼。
範例:放棄 josh
的第二密碼,使該帳戶僅保留其主要密碼:
ALTER USER 'josh'@'localhost' DISCARD OLD PASSWORD;
在沒有特定類型的選項的情況下,帳戶在該方面保持不變。例如,如果沒有鎖定選項,則帳戶的鎖定狀態不會變更。
帳戶名稱後面可以接一個 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 PASSWORD
和DISCARD 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
具有 ADD
、MODIFY
和 DROP
子句,可讓您新增、修改或捨棄身份驗證因素。在每種情況下,子句都會指定要對一個身份驗證因素執行的操作,並選擇性地指定對另一個身份驗證因素執行的操作。對於每個操作,factor
項目會指定 FACTOR
關鍵字,前面加上數字 2 或 3,以表示操作是否適用於第二個或第三個身份驗證因素。(在此內容中不允許 1。若要對第一個身份驗證因素執行操作,請使用ALTER USER 身份驗證選項中描述的語法。)
ALTER USER
多因素身份驗證子句限制由 authentication_policy
系統變數定義。例如,authentication_policy
設定控制帳戶可能擁有的身份驗證因素數量,以及每個因素允許的身份驗證方法。請參閱設定多因素身份驗證原則。
當 ALTER USER
在單一陳述式中新增、修改或捨棄第二和第三個因素時,操作會依序執行,但如果序列中的任何操作失敗,則整個 ALTER USER
陳述式都會失敗。
對於 ADD
,每個命名的因素都不得已存在,否則無法新增。對於 MODIFY
和 DROP
,每個命名的因素都必須存在才能修改或捨棄。如果定義了第二和第三個因素,則捨棄第二個因素會導致第三個因素取代其作為第二個因素的位置。
此陳述式會捨棄身份驗證因素 2 和 3,其效果是將帳戶從 3FA 轉換為 1FA
ALTER USER 'user' DROP 2 FACTOR 3 FACTOR;
如需其他 ADD
、MODIFY
和 DROP
範例,請參閱開始使用多因素身份驗證。
如需有關因素特定規則的資訊,這些規則會判斷未命名外掛程式的身份驗證子句的預設身份驗證外掛程式,請參閱預設身份驗證外掛程式。
ALTER USER
具有可註冊和取消註冊 FIDO/FIDO2 裝置的子句。如需更多資訊,請參閱使用 WebAuthn 驗證、WebAuthn 的裝置取消註冊,以及 mysql 用戶端的 --register-factor
選項說明。
用於 FIDO/FIDO2 裝置註冊的 mysql 用戶端 --register-factor
選項,會使 mysql 用戶端產生並執行 INITIATE REGISTRATION
和 FINISH REGISTRATION
陳述式。這些陳述式不適用於手動執行。
ALTER USER ... DEFAULT ROLE
定義了當使用者連線到伺服器並驗證身分時,或當使用者在工作階段期間執行 SET ROLE DEFAULT
陳述式時,哪些角色會變為作用中狀態。
ALTER USER ... DEFAULT ROLE
是 SET 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
時存在並授予給該帳戶。
除了基於使用者名稱和憑證的常用驗證之外,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
,以便可以驗證伺服器提供的公用憑證。)ISSUER
和SUBJECT
也一樣,因為這些REQUIRE
選項表示X509
的要求。ISSUER '
issuer
'對於陳述式所命名的所有帳戶,要求用戶端提供由 CA
'
發行的有效 X.509 憑證。如果用戶端提供的憑證有效,但發行者不同,則伺服器會拒絕連線。使用 X.509 憑證始終表示加密,因此在這種情況下,issuer
'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';
SUBJECT
、ISSUER
和 CIPHER
選項可以在 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';
可以對帳戶使用伺服器資源設定限制,如第 8.2.21 節,〈設定帳戶資源限制〉中所述。若要執行此操作,請使用指定一個或多個 resource_option
值的 WITH
子句。
WITH
選項的順序無關緊要,但如果多次指定給定的資源限制,則最後一個執行個體優先。
ALTER USER
允許使用這些 resource_option
值
MAX_QUERIES_PER_HOUR
、count
MAX_UPDATES_PER_HOUR
、count
MAX_CONNECTIONS_PER_HOUR
count
對於陳述式所命名的所有帳戶,這些選項會限制每個帳戶在任何給定的一小時期間內可以執行多少個查詢、更新和連線到伺服器。如果
count
為0
(預設值),則表示該帳戶沒有限制。MAX_USER_CONNECTIONS
count
對於語句中指定的所有帳戶,限制每個帳戶同時連線到伺服器的最大數量。非零的
count
值明確指定該帳戶的限制。如果count
為0
(預設值),伺服器會根據max_user_connections
系統變數的全域值來決定該帳戶的同時連線數量。如果max_user_connections
也為零,則該帳戶沒有限制。
範例
ALTER USER 'jeffrey'@'localhost'
WITH MAX_QUERIES_PER_HOUR 500 MAX_UPDATES_PER_HOUR 100;
ALTER USER
支援多個用於密碼管理的 password_option
值。
密碼過期選項:您可以手動使帳戶密碼過期,並建立其密碼過期策略。策略選項不會使密碼過期。相反地,它們會決定伺服器如何根據密碼的期限,自動對帳戶應用過期機制,而密碼期限是從最近一次變更帳戶密碼的日期和時間開始評估的。
密碼重複使用選項:您可以根據密碼變更次數、經過的時間或兩者來限制密碼的重複使用。
密碼驗證要求選項:您可以指出變更帳戶密碼的嘗試是否必須指定當前密碼,以驗證嘗試進行變更的使用者實際上知道當前密碼。
錯誤密碼登入失敗追蹤選項:您可以使伺服器追蹤登入失敗的嘗試,並暫時鎖定連續輸入太多次錯誤密碼的帳戶。所需的失敗次數和鎖定時間是可設定的。
本節介紹密碼管理選項的語法。有關建立密碼管理策略的資訊,請參閱第 8.2.15 節「密碼管理」。
如果指定了多個給定類型的密碼管理選項,則最後一個選項優先。例如,PASSWORD EXPIRE DEFAULT PASSWORD EXPIRE NEVER
與 PASSWORD 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_ATTEMPTS
和 PASSWORD_LOCK_TIME
選項都必須為非零值。以下語句修改帳戶,使其在連續密碼失敗四次後保持鎖定兩天
ALTER USER 'jeffrey'@'localhost'
FAILED_LOGIN_ATTEMPTS 4 PASSWORD_LOCK_TIME 2;
MySQL 8.4 支援使用者註解和使用者屬性,如第 15.7.1.3 節「CREATE USER Statement」中所述。這些可以使用 ALTER USER
通過 COMMENT
和 ATTRIBUTE
選項分別進行修改。您不能在同一個 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)
MySQL 支援使用 ACCOUNT LOCK
和 ACCOUNT UNLOCK
選項來鎖定和解鎖帳戶,這些選項指定帳戶的鎖定狀態。如需更多討論,請參閱第 8.2.20 節「帳戶鎖定」。
如果指定了多個帳戶鎖定選項,則最後一個選項優先。
ALTER USER ... ACCOUNT UNLOCK
會解鎖任何因登入失敗次數過多而暫時鎖定的語句所命名的帳戶。請參閱第 8.2.15 節「密碼管理」。
如果 ALTER USER
成功,則會寫入二進制日誌,但如果失敗則不會寫入;在這種情況下,會發生回滾且不會進行任何變更。寫入二進制日誌的語句包含所有命名的使用者。如果給定了 IF EXISTS
子句,則這甚至包括不存在且未被修改的使用者。
如果原始語句變更了使用者的憑證,則寫入二進制日誌的語句會指定該使用者適用的身份驗證外掛程式,判斷方式如下
如果指定了外掛程式,則為原始語句中命名的外掛程式。
否則,如果使用者存在,則為與使用者帳戶關聯的外掛程式,如果使用者不存在,則為預設的身份驗證外掛程式。(如果寫入二進制日誌的語句必須為使用者指定特定的身份驗證外掛程式,請將其包含在原始語句中。)
如果伺服器為寫入二進制日誌的語句中的任何使用者新增了預設的身份驗證外掛程式,則會將警告寫入錯誤日誌,並命名這些使用者。
如果原始語句指定了 FAILED_LOGIN_ATTEMPTS
或 PASSWORD_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
MODIFYfactor
IDENTIFIED WITH authentication_webauthn ASwebauthn_hash_string
在複寫環境中,複寫使用者需要
PASSWORDLESS_USER_ADMIN
權限才能對使用authentication_webauthn
外掛程式設定為無密碼身份驗證的帳戶執行ALTER USER ... MODIFY
操作。