SQLの学習用にデータベースを作成してみる。（その１）ユーザーとロールの作成

# はじめに
　[初歩的なSQLコマンドをまとめてみました。](https://qiita.com/SAMisnotMydog/items/6a2dbe57458ab23ed94d)で基本的なSQLコマンドを自分なりに整理してみたけれども、ちょこちょこ間違えてるところもあったし、SQLの理解を深めるにはやはりデータベースを作って回数こなさないとね。
 というわけで、自宅のMacにMySQLを入れてデータベースを作っていきます。
　単なる学習目的だとなかなか興味が湧かず続かないので、ボートレース競技を題材に簡単なデータベースの作成です。
　訓練所では、そろそろ求職活動も始まり、指名求人の来ないオッチャンとしては、就職にしくじった時のためにも、データベース作成の最終目標を機械学習で予想データを出すところまでもって行きたいところです、ガッポガッポといきたいところです。

開発環境は
・macOS Monterey (12.2.1)
・MacBookPro (2019)
・VSCode (1.64.2)  拡張機能：MySQL　(v0.4.1),Python (v2022.0.1814523869)他
・Python (3.9.7)
です。

## 今回のお品書き
1. MySQLのインストール
1. データベースの作成
1. データベースのユーザー作成
    3-1. ユーザーの作成
    3-2. ロールの作成
    3-3. 権限の作成
    3-4. ロールの割り当て

となっております。

## 1.MySQLのインストール
　公式サイトからインストーラーをダウンロードしてもいいんですけど、最近はHomebrewでインストールってのが多いみたいなので、右にならえでbrewです。

~~~bash:Macターミナル
samisnotmaydog@MacBook ~ % brew install mysql 

By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

（途中省略）

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done! 
~~~
インストールとアンインストール繰り返してたりするので、ちょっと再現が入ってますが、確かこんな感じだったとおもいます。

　MySQLを起動します。起動は`brew services start mysql`でも`mysql.server start`でもできるみたいです。違いはなんなんでしょうか？調べておきます。
と思ったらありました貼っておきます、ありがたいです。

https://qiita.com/yamayamasou/items/3f54afad6448a3ddb652

Macの再起動後にMySQLが起動するかしないかの違いみたいですね。

では、`brew services start mysql`で起動させていきます。
停止させるときは　`brew services stop mysql`　ですね、解りやすいですね。


```bash:Macターミナル
samisnotmaydog@MacBook ~ % brew services start mysql
==> Successfully started `mysql` (label: homebrew.mxcl.mysql)
samisnotmaydog@MacBook ~ % mysql -u root -p
Enter password: 
```
ここからは、そのままターミナルでの作業ですが、MySQLに入っていきます。
```sql:MySQL
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.28 Homebrew

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SELECT VERSION();
+-----------+
| version() |
+-----------+
| 8.0.28    |
+-----------+
1 row in set (0.00 sec)
```
　　バージョンは8.0.28でした。

　VScodeにはMySQLの拡張機能を入れてあるのですが、訓練所のWindows+XAMPPではうまいこと接続できていたのですが、今回は接続ができませんでした。
　原因は認証形式の違いによるとのことなので、設定を変えていきます。

https://qiita.com/evansplus/items/66e06df882e9f40c092f

を参考にしました。助かりました。
　では、認証方法を変更して、VSCodeでもMySQLに接続できるようにしておきます。
```sql:MySQL
mysql> use mysql
Database changed
mysql> SELECT user, plugin FROM user;
+------------------+-----------------------+
| user             | plugin                |
+------------------+-----------------------+
| mysql.infoschema | caching_sha2_password |
| mysql.session    | caching_sha2_password |
| mysql.sys        | caching_sha2_password |
| root             | caching_sha2_password |
+------------------+-----------------------+
4 rows in set (0.00 sec)

mysql> ALTER USER 'root'@'localhost'
    ->   IDENTIFIED WITH mysql_native_password
    ->   BY 'チョメチョメ';
Query OK, 0 rows affected (0.00 sec)

mysql>　SELECT user, plugin FROM user;
+------------------+-----------------------+
| user             | plugin                |
+------------------+-----------------------+
| mysql.infoschema | caching_sha2_password |
| mysql.session    | caching_sha2_password |
| mysql.sys        | caching_sha2_password |
| root             | mysql_native_password |
+------------------+-----------------------+
4 rows in set (0.00 sec)
```
　ユーザー認証をパスワード認証にしたら,VSCodeでもログインできました。
今回はこのままターミナルで作業を続けます。

　ちなみに、チョメチョメは[こうゆう意味](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%A4%E3%83%BB%E3%82%A2%E3%82%A4%E3%82%B2%E3%83%BC%E3%83%A0#:~:text=%E3%83%81%E3%83%A7%E3%83%A1%E3%83%81%E3%83%A7%E3%83%A1%E3%81%A8%E3%81%AF%E3%80%8C%C3%97%E3%80%8D%E3%80%8C,%E8%B5%B7%E6%BA%90%E3%81%A8%E3%81%84%E3%81%86%E8%AA%AC%E3%82%82%E3%81%82%E3%82%8B%E3%80%82)(by wikipedia)です、昭和なオヤジなもんでスイマセン。

## 2.データベースの作成
　では、データベースを作ります、名前は　'boatraceDB'　です。

```sql:MySQL
mysql> CREATE DATABASE boatraceDB;
Query OK, 1 row affected (0.01 sec)

mysql> SHOW databases;
+--------------------+
| Database           |
+--------------------+
| boatraceDB         |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
```
　出来てますね、まだ簡単です。

## 3.データベースのユーザー作成
　訓練所ではデータベースの操作は 'root' で作業を進めていましたが、今回は別のユーザーを作って作業していきます。
単純にユーザーを作ればいいのですが、それだけでは面白くないので、ユーザーに直接権限を設定せずにロールを作成して、ユーザーにロールを付与する２段構えにトライします。

[MySQL 8.0 リファレンスマニュアル  /  GRANT ステートメント](https://dev.mysql.com/doc/refman/8.0/ja/grant.html)　と

https://qiita.com/hmatsu47/items/e4a49d32685220d492a9

の記事を参考に作成していきます、ありがとうございます。

### 

### 3-1.ユーザーの作成
　ユーザー名は 'sam' で、パスワード認証にします。
認証方式はコレしかまだ理解できません。

```sql:MySQL
mysql> CREATE USER　sam　IDENTIFIED BY 'チョメチョメ';
Query OK, 0 rows affected (0.01 sec)
```

### 3-2.ロールの作成
　競艇データベースの作業用の権限を 'boatdb_dev' と名付けます。
```sql:MySQL
mysql> CREATE ROLE boatdb_dev;
Query OK, 0 rows affected (0.01 sec)
```
　まだロール（役割）を割り当てただけで、具体的な役割データベースに対して許可されている操作や出来ることは、なにも決められていません。
### 3-3.権限の作成
　GRANT文で作成しますが、
```sql:MySQL
/*GRANT　要るとこだけ*/ 
GRANT priv_type [(column_list)][, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    TO user_or_role [, user_or_role] ...
```
　色々細かに設定できますが、今回は掘り下げるの別の機会として。。。とりあえずデータベース管理以外の権限を放り込んであります。
```sql:MySQL
mysql> GRANT ALTER,CREATE,CREATE　VIEW,DELETE,DROP,EVENT,EXECUTE
,INDEX,INSERT,LOCK TABLES,REFERENCES,SELECT,SHOW VIEW,TRIGGER,UPDATE 
ON boatraceDB.* TO boatdb_dev;
Query OK, 0 rows affected (0.00 sec)
```
　'データベース名.*' なのは見逃してました、何回もエラーって言われました。
そんな怒らんでもエエのに。


### 3-4.ロールの割り当て
　ユーザー' sam' に 'boatdb_dev' ロールを付与します。
```sql:MySQL
mysql> GRANT boatdb_dev TO sam;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM mysql.role_edges;
+-----------+------------+---------+---------+-------------------+
| FROM_HOST | FROM_USER  | TO_HOST | TO_USER | WITH_ADMIN_OPTION |
+-----------+------------+---------+---------+-------------------+
| %         | boatdb_dev | %       | sam     | N                 |
+-----------+------------+---------+---------+-------------------+
1 row in set (0.00 sec)
```
確認できました。

　今日はここまでにします。
```sql:MySQL
mysql> exit;
Bye
samisnotmaydog@MacBook ~ % brew services stop mysql
Stopping `mysql`... (might take a while)
==> Successfully stopped `mysql` (label: homebrew.mxcl.mysql)
samisnotmaydog@MacBook ~ % 
```

# 次回に続く
　時間を作って、最終目標の予想までどのくらい時間が掛かるか解りませんが、コツコツと続けていければと思います。