> ## Documentation Index
> Fetch the complete documentation index at: https://villagesql.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# MySQL のユーザー管理

> MySQL ユーザーを作成、変更、削除する方法: CREATE USER の構文、権限レベル、GRANT と REVOKE、MySQL 8.4 のロール、そして最小権限のベストプラクティス。

> [card] [VillageSQL is a drop-in replacement for MySQL with extensions.](https://villagesql.com/docs/en/8.4/stable/install-server.md)
>
> All examples on this page work on VillageSQL. Install Now →

MySQL のアクセス制御モデルは、認証(あなたが誰か)と認可(あなたが何をできるか)を分離します。ユーザーアカウントを作成し、それとは別に権限を付与します。

## ユーザーの作成

```sql theme={null}
CREATE USER 'alice'@'localhost' IDENTIFIED BY 'strong_password';
```

`@'localhost'` の部分はホスト制限です。このアカウントはローカルマシンからしか接続できません。よくあるホストのパターンは次のとおりです。

| ホスト | 意味 |
| :- | :- |
| `'localhost'` | ローカルソケット接続のみ |
| `'127.0.0.1'` | TCP ループバックのみ |
| `'%'` | 任意のホスト(ネットワークアクセス) |
| `'192.168.1.%'` | そのサブネット内の任意のホスト |
| `'app.example.com'` | 特定のホスト名 |

`'alice'@'localhost'` と `'alice'@'%'` は、ユーザー名が同じでも 2 つの別々のアカウントです。

## 権限の付与

```sql theme={null}
-- Read-only access to one database
GRANT SELECT ON myapp.* TO 'alice'@'localhost';

-- Full access to one database
GRANT ALL PRIVILEGES ON myapp.* TO 'alice'@'localhost';

-- Specific privileges on one table
GRANT SELECT, INSERT, UPDATE ON myapp.orders TO 'alice'@'localhost';

-- Global privilege (all databases)
GRANT PROCESS ON *.* TO 'alice'@'localhost';
```

権限の対象は `database.table` 記法を使います。

* `*.*` — すべてのデータベースのすべてのテーブル(グローバル)
* `myapp.*` — `myapp` データベースのすべてのテーブル
* `myapp.orders` — `orders` テーブルのみ

## 権限レベル

| レベル | 範囲 | 例 |
| :- | :- | :- |
| グローバル | すべてのデータベース | `GRANT RELOAD ON *.*` |
| データベース | 1 つのデータベース | `GRANT CREATE ON myapp.*` |
| テーブル | 1 つのテーブル | `GRANT SELECT ON myapp.users` |
| 列 | 特定の列 | `GRANT SELECT (id, name) ON myapp.users` |
| ストアドルーチン | プロシージャまたは関数 | `GRANT EXECUTE ON PROCEDURE myapp.get_user` |

よく使う権限は次のとおりです。

| 権限 | 許可する操作 |
| :- | :- |
| `SELECT` | 行の読み取り |
| `INSERT` | 行の挿入 |
| `UPDATE` | 行の変更 |
| `DELETE` | 行の削除 |
| `CREATE` | テーブルとデータベースの作成 |
| `DROP` | テーブルとデータベースの削除 |
| `INDEX` | インデックスの作成と削除 |
| `ALTER` | テーブル構造の変更 |
| `EXECUTE` | ストアドプロシージャと関数の実行 |
| `PROCESS` | 実行中のすべてのクエリの表示(`SHOW PROCESSLIST`) |
| `SUPER` | 制限の回避。管理操作 |
| `ALL PRIVILEGES` | 指定した範囲のすべての権限 |

## 付与内容の表示

```sql theme={null}
-- Show grants for the current user
SHOW GRANTS;

-- Show grants for a specific user
SHOW GRANTS FOR 'alice'@'localhost';
```

## 権限の取り消し

```sql theme={null}
REVOKE INSERT ON myapp.* FROM 'alice'@'localhost';
REVOKE ALL PRIVILEGES ON myapp.* FROM 'alice'@'localhost';
```

付与されたことのない権限を取り消すと、`ERROR 1141: There is no such grant defined for user` が返ります。ユーザーは他のレベルで付与された権限を保持します。`SELECT ON myapp.*` を取り消しても、`SELECT ON myapp.orders` が別に付与されていれば、それは削除されません。

## パスワードの変更

```sql theme={null}
ALTER USER 'alice'@'localhost' IDENTIFIED BY 'new_password';
```

次回ログイン時にパスワードの変更を強制します。

```sql theme={null}
ALTER USER 'alice'@'localhost' PASSWORD EXPIRE;
```

## ロール(MySQL 8.0 以降)

ロールは、名前の付いた権限の集まりです。各ユーザーに個別の権限を付与する代わりに、ロールを付与します。

```sql theme={null}
-- Create a role
CREATE ROLE 'app_reader', 'app_writer';

-- Grant privileges to the role
GRANT SELECT ON myapp.* TO 'app_reader';
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp.* TO 'app_writer';

-- Grant the role to a user
GRANT 'app_reader' TO 'alice'@'localhost';
GRANT 'app_writer' TO 'bob'@'%';
```

ユーザーがロールの権限を使うには、ロールを有効化する(またはデフォルトとして設定する)必要があります。

```sql theme={null}
-- Activate in session
SET ROLE 'app_reader';

-- Set default role so it activates automatically on login
SET DEFAULT ROLE 'app_reader' TO 'alice'@'localhost';
```

## ユーザーの削除

```sql theme={null}
DROP USER 'alice'@'localhost';
```

ユーザーを削除すると、そのすべての権限が自動的に取り消され、すべてのロールから外されます。ユーザーが接続中であれば、そのセッションは終了するまで続きます。

## 最小権限のベストプラクティス

各アカウントには必要な権限だけを与えます。

* アプリケーションの読み取りレプリカ: `SELECT` のみ
* アプリケーションの書き込みアカウント: `SELECT`、`INSERT`、`UPDATE`、`DELETE`
* アプリケーションのスキーマアカウント(マイグレーション): `CREATE`、`ALTER`、`DROP`、`INDEX` を追加
* DBA アカウント: `*.*` に対する `ALL PRIVILEGES`
* アプリケーションアカウントには `SUPER` や `ALL` を決して付与しない

ホストはできる限り厳しく制限します。`app.example.com` 上のアプリケーションは、`'appuser'@'%'` ではなく `'appuser'@'app.example.com'` を使うべきです。

## よくある質問

#### MySQL は権限を自動的にフラッシュしますか?

`CREATE USER`、`GRANT`、`REVOKE`、`ALTER USER` によるすべての変更はすぐに反映されます。`FLUSH PRIVILEGES` は不要です。`FLUSH PRIVILEGES` が必要なのは、権限テーブルを `INSERT`/`UPDATE` で直接変更した場合だけです(そうすべきではありません)。

#### `localhost` と `127.0.0.1` の違いは何ですか?

MySQL の `localhost` は、ネットワークのループバックではなく、Unix ソケット接続(ローカルのファイルソケット)を指します。`127.0.0.1` は TCP ループバックです。同じマシン上でもクライアントが TCP で接続するなら、ホスト制限には `127.0.0.1` を使ってください。

## トラブルシューティング

| 問題 | 解決策 |
| :- | :- |
| `ERROR 1045: Access denied for user` | パスワードが違う、ホストが違う、またはアカウントが存在しない — `SELECT user, host FROM mysql.user` で確認する |
| ユーザーは接続できるがクエリできない | `SHOW GRANTS FOR 'user'@'host'` で付与内容を確認する — 権限レベルが範囲(データベースかグローバルか)と一致している必要がある |
| `GRANT` が `ERROR 1044` で失敗する | 現在のユーザーに `GRANT OPTION` 権限がない — root または `GRANT OPTION` を持つユーザーで接続する |
| ユーザーを作成したがアプリサーバーからログインできない | `@'host'` のパターンがアプリサーバーのホスト名または IP と一致しない — アカウントのホストパターンを追加または更新する |
| `DROP USER` が失敗する | 正確なユーザーとホストの組み合わせを確認する: `SELECT user, host FROM mysql.user WHERE user = 'alice'` |

## 関連項目

* [MySQL のセキュリティ強化](https://villagesql.com/docs/ja/guides/security-hardening.md) — ユーザー権限を補完するサーバーレベルのセキュリティ
* [MySQL の INFORMATION\_SCHEMA](https://villagesql.com/docs/ja/guides/information-schema.md) — コマンドの背後にある付与内容とメタデータのクエリ
* [よくある MySQL のエラーとその修正方法](https://villagesql.com/docs/ja/guides/common-mysql-errors.md) — アクセス拒否などの頻出エラーの読み解き
* [JWT で MySQL ユーザーを認証する方法](https://villagesql.com/docs/ja/guides/jwt-authentication.md) — パスワードの代わりにトークンでサインインするアカウント


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.