◀ 2.

ユーザー定義変更|Oracle ALTER USERとMySQLの例を分ける

▶

ユーザー定義変更を、元の記事が扱ったOracleと、後から追加されたMySQLの教材に分けて説明します。Oracleの元構文/例を戻し、MySQLの検証済みコードや図も削除せず後半へ保持しています。識別子・認証・PDB/hostの違いを確認してから該当する製品の章を選びます。

DB製品とPDBを確認し、作成・属性変更・削除の目的と接続や依存への影響を分ける図

Oracleで変更前のPDBと対象を確認する

以下は新しいローカル隔離PDBの検体専用です。一般に他ユーザーの属性変更にはALTER USERシステム権限等が必要ですが、自分のパスワード変更などは条件が異なります。既存本番ユーザー/アプリ接続を検証のために変更せず、承認された管理者が対象/現状/依存を確認します。

-- Read only. Confirm the intended product, PDB service and authorized account.
SELECT USER, SYS_CONTEXT('USERENV','CON_NAME') AS container_name FROM dual;
SELECT privilege FROM user_sys_privs ORDER BY privilege;

ロックと既存接続を分ける

次は対象の新規ログインをロックし、解除する別の操作です。隔離検体ではロック後の新規接続がORA-28000になりましたが、ロック前の接続はそのままSELECTできました。無通信やアカウント削除まで完了したと扱わず、接続プール/バッチ等を計画に含めます。

-- New owned scratch PDB/account only. This does not kill an existing session.
ALTER USER CWIKI_W20_CHANGE ACCOUNT LOCK CONTAINER=CURRENT;
-- Same scratch PDB/account; unlock does not reset the password or all other conditions.
ALTER USER CWIKI_W20_CHANGE ACCOUNT UNLOCK CONTAINER=CURRENT;

パスワード変更はアプリ側の保存値を変更しない

公開された検体名/パスワードだけを使った例です。実運用では秘密値を記事/引数/スプール等へ残さず、既存の秘密管理を使います。隔離検体では旧値の新規接続が失敗し、新値では成功しても、変更前から存在する接続は継続しました。利用者の保存値や全セッションが一括更新されるわけではありません。

-- Public fixture value only; never use this as a real production password.
ALTER USER CWIKI_W20_CHANGE IDENTIFIED BY "Cwiki_new_fixture_42!" CONTAINER=CURRENT;

既定表領域と既存データの移動・quotaは別

次は検体内にあらかじめ作成したCWIKI_W20_DATAへ既定を変える例です。実在/使用可能な表領域を確認し、元例のSYSTEMをアプリ用の既定先として無条件に使いません。既存表は元の表領域に残り、変更だけで移動しません。新しい表領域のquotaも自動で増えず、隔離検体では新規表への最初のINSERTがORA-01950となり、検体に明示quotaを付けた後に成功しました。

-- Existing owned scratch tablespace only; does not move previously created tables.
ALTER USER CWIKI_W20_CHANGE DEFAULT TABLESPACE CWIKI_W20_DATA CONTAINER=CURRENT;

これは新しい管理用表領域を本番へ作る手順ではありません。quotaや表作成権限は別に設計し、無制限quota/DBAを接続エラーの対処として与えません。対象属性を限定し、DDLをROLLBACKすれば元通りになると考えず、既存の復旧計画を確認します。

元v5のOracle構文と例

元の書式付き構文と例は次に保持します。日本語の置換箇所や角括弧は説明用で、任意指定を全て省略してそのまま実行できる保証ではありません。bbbは公開された弱い値、SYSTEMはこの教材の推奨配置先ではありません。変更前の表を移動する例としても使いません。

Oracleのユーザー定義変更の記事です。

 

【構文】※[]は任意です。

ALTER USER ユーザー名

    [IDENTIFIED BY 変更後パスワード]

    [DEFAULT TABLESPACE 変更後デフォルトテーブルスペース]; 

 

【例】

ALTER USER test_user

    IDENTIFIED BY "bbb"

    DEFAULT TABLESPACE system; 

 

MySQLのALTER USER:認証・期限・ロックの教材

ここからはOracleではなく、MySQLの既存教材です。User/Hostや認証pluginをOracleへ流用せず、各章の対象版/要件を確認します。既存の図/コード/説明も保持しています。

ALTER USERは、選択した既存アカウントの認証・期限・ロック・接続要件などを変更します。パスワード変更、権限の付与、接続の強制終了は同じ操作ではありません。User/Hostと変更前の条件、利用中のアプリを確認してから計画してください。

対象アカウント・変更する属性・新規接続と既存接続への影響を分ける図

何を変え、何を変えない操作か

指定変更と限界
IDENTIFIED BY / WITH資格情報/認証方式を変更。アプリ側の保管値やドライバが自動更新されるわけではない
ACCOUNT LOCK新規ログインを拒否。既存セッションの強制終了ではない
PASSWORD EXPIRE系今の失効と将来の期限を区別。NEVERだけで手動失効は解除されない
REQUIRE SSL / X509アカウント側の接続要件。クライアント側のサーバー検証は別途設定する
DEFAULT ROLE付与済みロールの有効化。権限を新たに付与するGRANTとは別

変更前に対象アカウントを読み取り確認する

次はMySQL 8.0で、既に許可された管理接続がある場合の読み取り例です。認証に失敗した接続からは実行できません。接続先とCURRENT_USER()、rootのHost/認証方式/ロック/期限を照合します。アカウント情報をそのまま公開せず、authentication_stringやパスワードを出力しません。

SELECT VERSION() AS server_version, CURRENT_USER() AS authenticated_account;

-- Authorized administrator only. Do not publish account information.
SELECT User, Host, plugin, account_locked, password_expired, password_lifetime
FROM mysql.user
WHERE User = 'root'
ORDER BY Host;

接続できることと必要な管理権限があることは別です。管理者用とアプリ実行用を分け、情報確認のためにGRANT ALLや外部接続範囲の拡大を行わないでください。

変更後は新規接続と既存接続を分けて確認し、必要な権限/アプリ処理を検証します。接続拒否の原因と関係ない属性をまとめて変えないでください。

一次資料: MySQL 8.0の公式復旧手順、8.4の公式復旧手順、ALTER USERの対象と要件、現在も有効なSET PASSWORD構文、mysql_native_passwordの状態、検証コンポーネントの導入条件。

ロックの範囲は公式アカウントロック説明も参照してください。

この記事の要点
  • ALTER USER は MySQL でユーザー定義を変更する SQL。パスワード、認証方式、期限、ロック状態などを変えられる
  • パスワード変更: ALTER USER 'user'@'host' IDENTIFIED BY 'newpw'; — 5.7.6 以降の推奨方式
  • 認証プラグイン変更: IDENTIFIED WITH caching_sha2_password 等で方式を切り替え
  • アカウントロック: ACCOUNT LOCK / ACCOUNT UNLOCK で新規ログインの拒否・許可。既存セッションの強制終了とは別
  • パスワード期限: PASSWORD EXPIRE INTERVAL 90 DAY で 90 日ごとに変更を強制
  • リソース制限: WITH MAX_QUERIES_PER_HOUR / MAX_CONNECTIONS_PER_HOUR で過剰利用を抑制

ALTER USER とは

ALTER USER は MySQL で既存ユーザーの属性を変更する SQL 文です。パスワード、認証方式、アカウントロック、パスワード期限ポリシー、接続制限など、ユーザーに関するほぼ全ての設定を変更できます。

MySQL 8.0ではALTER USERとSET PASSWORDが有効です。SET PASSWORD全体を非推奨とは扱わず、旧PASSWORD()関数の構文と区別します。mysql.userの直接UPDATEはアカウント管理手順にしません。

基本構文

下は属性の概略で、角括弧や日本語を含む実行用SQLではありません。各オプションをすべて使う意味でもありません。以下の全変更例も架空のアカウント/秘密値で、まとめて実行しないでください。

ALTER USER 'ユーザー名'@'ホスト'
    [IDENTIFIED [WITH 認証プラグイン] BY 'パスワード']
    [REQUIRE 接続要件]
    [WITH リソース制限]
    [PASSWORD EXPIRE 期限指定]
    [ACCOUNT LOCK | ACCOUNT UNLOCK];

1. パスワードを変更する

下は資格情報の変更です。公開例のパスワードを使用せず、User/Host・必要権限・認証方式・秘密情報保管先/アプリへの反映を確認します。通常変更ではFLUSH PRIVILEGESは不要です。USER()を使う自己更新は専用構文で、通常のUSER()の戻り値を無条件にアカウント名として流用する意味ではありません。

-- 別ユーザーのパスワードを変更 (要権限)
ALTER USER 'alice'@'localhost' IDENTIFIED BY 'NewP@ss1';

-- 現在ログイン中のユーザー自身のパスワード変更
ALTER USER USER() IDENTIFIED BY 'NewP@ss1';

-- 複数まとめて変更
ALTER USER
    'alice'@'localhost' IDENTIFIED BY 'newpw1',
    'bob'@'%'           IDENTIFIED BY 'newpw2';

2. 認証プラグインを変更する

MySQL 8.0の既定はcaching_sha2_passwordです。下のmysql_native_passwordへの変更と短いpwは旧例で、そのまま実行しません。古いドライバのために認証を弱めず、クライアント更新と対応認証/TLSを先に検証します。

-- caching_sha2_password に変更 (推奨)
ALTER USER 'alice'@'localhost'
    IDENTIFIED WITH caching_sha2_password BY 'StrongP@ss1';

-- 古いアプリ向けに mysql_native_password へ変更
ALTER USER 'legacy'@'localhost'
    IDENTIFIED WITH mysql_native_password BY 'pw';
プラグイン特徴
caching_sha2_passwordMySQL 8.0 既定。SHA-256 ベース。推奨
mysql_native_password8.0.34で非推奨、8.4で既定無効、9.0で削除。差し戻しを通常対処にしない
sha256_passwordSHA-256 だがキャッシュなし。実用上 caching_sha2 推奨
auth_socketOS のソケット認証。Linux ローカル運用に便利

3. アカウントのロック / アンロック

下は新規ログインの可否を変更します。既に接続済みのセッションは、この操作だけでは終了しません。ホストキャッシュによる1129やパスワード失効をACCOUNT UNLOCKですべて直せるわけでもありません。影響する既存接続の扱いは別に計画します。

-- ログイン不可にする (退職者対応など)
ALTER USER 'alice'@'localhost' ACCOUNT LOCK;

-- ロック解除
ALTER USER 'alice'@'localhost' ACCOUNT UNLOCK;

ロックはアカウント定義を残して新規ログインを拒否する操作で、監査履歴の自動保存や既存セッション停止まで保証するものではありません。DROP USERとの影響差を確認し、退職対応等も実際の権限/接続の失効計画に従います。

4. パスワード期限ポリシー

下は別々の方針の例で、順次実行すると後の設定が有効になります。NEVER/DEFAULT等の将来の自動期限と、手動の失効状態を区別し、エラー回避のための無期限化はしません。実際の復旧は期限切れの関連ページを参照します。

-- 即時期限切れにする (次回ログイン時に変更必須)
ALTER USER 'alice'@'localhost' PASSWORD EXPIRE;

-- 90 日ごとに変更を強制
ALTER USER 'alice'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;

-- 期限なし
ALTER USER 'alice'@'localhost' PASSWORD EXPIRE NEVER;

-- グローバル設定に従う
ALTER USER 'alice'@'localhost' PASSWORD EXPIRE DEFAULT;

5. パスワード履歴・再利用禁止 (MySQL 8.0+)

下の各条件は対象版と認証方式を確認し、ローテーション/秘密情報管理の手順へ組み込みます。PASSWORD REQUIRE CURRENT等の要件も実際の権限・更新構文で照合し、変更失敗を理由に弱めないでください。

-- 過去 5 件と同じパスワードは使えない
ALTER USER 'alice'@'localhost' PASSWORD HISTORY 5;

-- 過去 365 日以内に使ったパスワードは使えない
ALTER USER 'alice'@'localhost' PASSWORD REUSE INTERVAL 365 DAY;

-- パスワード変更時に現行パスワードを必須にする
ALTER USER 'alice'@'localhost' PASSWORD REQUIRE CURRENT;

6. SSL / TLS の強制

下のREQUIRE NONEは接続保護を外す旧変更例で、トラブル対処として実行しません。 REQUIRE SSLは暗号化、X509はクライアント証明書の要件です。これだけでクライアント側のサーバー証明書/ホスト名検証が設定されたことにはなりません。接続元と証明書管理も別途確認します。

-- SSL 接続を必須にする
ALTER USER 'alice'@'%' REQUIRE SSL;

-- 認証局つき SSL
ALTER USER 'alice'@'%' REQUIRE X509;

-- 暗号化要件をリセット
ALTER USER 'alice'@'%' REQUIRE NONE;

7. リソース制限

下の数値は設計済みの推奨値ではありません。対象アカウントの実利用・既存の上限・必要な接続数を測定して計画します。接続制限の変更をSQL高速化や障害原因の修正と同一視しません。

ALTER USER 'alice'@'%'
    WITH
        MAX_QUERIES_PER_HOUR     1000
        MAX_UPDATES_PER_HOUR     100
        MAX_CONNECTIONS_PER_HOUR 50
        MAX_USER_CONNECTIONS     5;
項目意味
MAX_QUERIES_PER_HOUR1 時間あたり実行可能なクエリ総数
MAX_UPDATES_PER_HOUR1 時間あたり実行可能な更新クエリ数
MAX_CONNECTIONS_PER_HOUR1 時間あたり可能な接続回数
MAX_USER_CONNECTIONS同時接続数の上限

8. ロール (MySQL 8.0+) のデフォルト指定

DEFAULT ROLEは既に付与されたロールの既定有効化を指定するもので、GRANTの代わりではありません。下のapp_read/app_writeは事前の存在と付与が前提です。ALLも存在する全ロールの一括付与ではなく、そのアカウントへ付与済みのロールが対象です。

-- ログイン時に自動的にアクティブになるロール
ALTER USER 'alice'@'localhost' DEFAULT ROLE 'app_read', 'app_write';

-- 全ロールをデフォルト
ALTER USER 'alice'@'localhost' DEFAULT ROLE ALL;

変更内容の確認

-- ユーザー一覧
SELECT user, host, account_locked, password_expired, password_lifetime
FROM mysql.user;

-- GRANT 状態(権限つき)
SHOW GRANTS FOR 'alice'@'localhost';

-- 自分自身
SHOW GRANTS;

FAQ

Q: SET PASSWORD と ALTER USER どちらを使う?
A: MySQL 8.0ではどちらも対応構文です。認証方式と要件に合わせて選び、SET PASSWORD全体と廃止されたPASSWORD()関数の旧例を混同しません。

Q: 自分のパスワードを変えたい
A: 自分の更新用にALTER USER USER() IDENTIFIED BYという専用構文があります。実際の認証アカウントと権限/ポリシーを確認し、公開例の秘密値は使いません。

Q: パスワードを忘れた
A: 承認済みの管理/回復経路を先に確認します。権限チェック無効化は全権限のローカル接続を許し得る危険な別作業で、一律の通常手順にはしません。

Q: Oracle の ALTER USER と違う点
A: MySQLのアカウントはUser/Hostの組です。Hostを省略すると%になり得るため「必須で省略不可」とは違いますが、対象の取り違えや接続範囲の誤解を避けるため明示して照合します。Oracleの構文/属性をそのまま流用しません。

関連手順を選ぶ

rootパスワードの通常変更と復旧、初期資格情報の確認から目的に合うものを選べます。エラーはMySQLエラー一覧の子ページから選んでください。

確認範囲と関連ページ

2026年10月26日確認。新しいOracle例はOracle AI Database 26ai Free 23.26.3.0.0の隔離PDBで、公開された検体アカウント/パスワードと新規データだけを使って検査しました。ロック/パスワードと既存接続、既定表領域とquota、権限不足、空ユーザー/接続中/所有物ありの削除、別スキーマの外部キー/ビューとROLLBACKの結果を確認しています。実運用のバックアップ復元、RAC/ASM、全認証方式/全DB版やMySQL/PostgreSQL/SQL Serverの全比較例を今回実行したものではありません。本番DBのユーザー/認証/権限/表領域は変更していません。

ユーザー関連の親ページから子ページを選択できます。Oracleのユーザー作成、ユーザー定義変更、Oracleのユーザー削除を操作別に参照してください。

一次資料:Oracle ALTER USERの権限とPDB/属性、Oracle DROP USERの権限・CASCADEと制限、MySQL 8.4 ALTER USER、PostgreSQLの将来オブジェクトの権限、SQL Serverのユーザー種類。

子ページ

子ページはありません

同階層のページ
  1. ユーザー作成
  2. ユーザー定義変更
  3. ユーザー削除

最近更新/作成されたページ