[MySQL] アカウント作成と権限付与

# はじめに
下記手順を紹介いたします。
* MySQLアカウント作成
* 権限付与
* データベース接続

# 動作確認環境
```
mysql> status
--------------
mysql  Ver 8.0.32 for Linux on x86_64 (MySQL Community Server - GPL)

Connection id:          14
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         8.0.32 MySQL Community Server - GPL
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8mb4
Db     characterset:    utf8mb4
Client characterset:    utf8mb4
Conn.  characterset:    utf8mb4
UNIX socket:            /var/lib/mysql/mysql.sock
Binary data as:         Hexadecimal
Uptime:                 26 days 22 hours 19 min 37 sec

Threads: 2  Questions: 41  Slow queries: 0  Opens: 148  Flush tables: 3  Open tables: 67  Queries per second avg: 0.000
--------------
```

# MySQLアカウント作成
mysqlクライアントを起動し、rootアカウントで接続します。
```
[root@mdb01 ~]# mysql -uroot -p
Enter password:
mysql>
```
現在のアカウント一覧を確認します。
host列は接続元のクライアントを表しており、アカウントは、ユーザ名@ホスト名という形で識別されます。
localhostとなっている場合は、MySQLサーバ以外のホストからは接続不可となります。
```
mysql> SELECT user, host FROM mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
4 rows in set (0.00 sec)
```
最初に接続元クライアントを指定せずに、chibattyというアカウントを作成します。
```
mysql> CREATE USER chibatty IDENTIFIED BY 'パスワード';
Query OK, 0 rows affected (0.03 sec)
```
作成されたアカウントを確認します。
接続元を指定しなかったため、host列に%が設定されています。%は接続元クライアントを制限しない事を表します。
```
mysql> SELECT user, host FROM mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| chibatty         | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
5 rows in set (0.01 sec)
```
続いて接続元クライアントをlocalhostに限定したアカウントを作成します。
```
mysql> CREATE USER chibatty@localhost IDENTIFIED BY 'パスワード';
Query OK, 0 rows affected (0.01 sec)
```
host列にlocalhostが設定されているアカウントが追加された事が確認できます。
```
mysql> SELECT user, host FROM mysql.user WHERE user = 'chibatty';
+----------+-----------+
| user     | host      |
+----------+-----------+
| chibatty | %         |
| chibatty | localhost |
+----------+-----------+
2 rows in set (0.00 sec)
```
今回は他サーバから接続する要件はないため、host列が%となっているアカウントをDROP USERのDDLにて削除します。
```
mysql> DROP USER chibatty;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT user, host FROM mysql.user WHERE user = 'chibatty';
+----------+-----------+
| user     | host      |
+----------+-----------+
| chibatty | localhost |
+----------+-----------+
1 row in set (0.00 sec)
```
mysqlクライアントを終了し、作成したアカウントでMySQLにログインします。
```
mysql> exit
Bye
[root@mdb01 ~]# mysql -uchibatty -p
Enter password:
mysql>
```
自身が接続中のアカウントは、CURRENT_USER()ファンクションを使用する事で確認可能です
```
mysql> SELECT CURRENT_USER();
+--------------------+
| CURRENT_USER()     |
+--------------------+
| chibatty@localhost |
+--------------------+
1 row in set (0.00 sec)
```
# 権限付与
chibattyアカウントを使用して、menagerieデータベースを選択してみます。
下記の通り権限不足によるエラーが発生しました。
```
mysql> USE menagerie
ERROR 1044 (42000): Access denied for user 'chibatty'@'localhost' to database 'menagerie'
```
また、SHOW DATABASESにて、データベース一覧を確認しましたが、menagerieは表示されません。
```
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| performance_schema |
+--------------------+
2 rows in set (0.00 sec)
```
現在、chibattyアカウントに付与されている権限を確認します。
USAGEという権限が付与されています。
USAGEは、MySQLサーバに接続できるのみの権限のため、現在の権限では、menagerieデータベースに接続できません。
```
mysql> SHOW GRANTS FOR chibatty@localhost;
+----------------------------------------------+
| Grants for chibatty@localhost                |
+----------------------------------------------+
| GRANT USAGE ON *.* TO `chibatty`@`localhost` |
+----------------------------------------------+
1 row in set (0.00 sec)
```
chibattyに権限を付与するため、rootアカウントにてMySQLサーバに接続します。
```
mysql> exit
Bye
[root@mdb01 ~]# mysql -uroot -p
Enter password:
mysql>
```
menagerieデータベースに対するすべての権限をchibattyに付与します。
```
mysql> GRANT ALL ON menagerie.* TO chibatty@localhost;
Query OK, 0 rows affected (0.01 sec)
```
chibattyアカウントに付与されている権限を確認します。
```
mysql> SHOW GRANTS FOR chibatty@localhost;
+-----------------------------------------------------------------+
| Grants for chibatty@localhost                                   |
+-----------------------------------------------------------------+
| GRANT USAGE ON *.* TO `chibatty`@`localhost`                    |
| GRANT ALL PRIVILEGES ON `menagerie`.* TO `chibatty`@`localhost` |
+-----------------------------------------------------------------+
2 rows in set (0.00 sec)
```
# データベース接続
chibattyアカウントを使用してチュートリアル用データベースに接続します。mysqlクライアント起動時のコマンドラインオプションにデータベース名を指定する事により、データベースを選択できます。あるいはmysqlクライアント起動後にUSE文を使用して選択する事も可能です。
```
[root@mdb01 ~]# mysql -uchibatty -p menagerie
Enter password:
mysql> SELECT CURRENT_USER(), DATABASE();
+--------------------+------------+
| CURRENT_USER()     | DATABASE() |
+--------------------+------------+
| chibatty@localhost | menagerie  |
+--------------------+------------+
1 row in set (0.00 sec)
```
ちなみに\Gを使用すると、行と列を入れ替えて表示できます。
対象列が多い場合など、有用な機能です。
```
mysql> SELECT CURRENT_USER(), DATABASE() \G
*************************** 1. row ***************************
CURRENT_USER(): chibatty@localhost
    DATABASE(): menagerie
1 row in set (0.00 sec)
```