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 sha2_password
BY 'password';
範例:與前面的範例類似,但此外,將當前密碼指定為明文值,以滿足任何帳戶要求,即進行變更的使用者知道該密碼
ALTER USER 'jeffrey'@'localhost'
IDENTIFIED WITH sha2_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 caching_sha2_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
可以為多個使用者設定預設值。另一方面,您可以將 CURRENT_USER
指定為 ALTER 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 憑證屬性。如需 MySQL 使用 SSL/TLS 的背景資訊,請參閱第 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';
可以在 REQUIRE
子句中組合 SUBJECT
、ISSUER
和 CIPHER
選項
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 節「設定帳戶資源限制」中所述,可以限制帳戶對伺服器資源的使用。若要這麼做,請使用 WITH
子句,指定一或多個 resource_option
值。
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 9.0 支援使用者註解和使用者屬性,如第 15.7.1.3 節「CREATE USER 語法」中所述。這些可以使用 ALTER USER
透過 COMMENT
和 ATTRIBUTE
選項來修改。您不能在同一個 ALTER USER
語法中指定兩個選項;嘗試這樣做會導致語法錯誤。
使用者註解和使用者屬性會以 JSON 物件的形式儲存在 Information Schema 的 USER_ATTRIBUTES
表格中;使用者註解會以 comment
鍵的值儲存在此表格的 ATTRIBUTE 欄位中,稍後在本討論中會說明。 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
操作。