Webサイト制作コースのお申し込みはこちら

MySQL 8.0以降でのuser作成についてまとめています。

以下、データベースとして、MySQLのサンプルデータベースEmployeesを使っています。

MySQL 8でのユーザ作成

MySQL8では、ROLE機能が導入されました。これまで、create userとGrant文を実行してユーザ作成・権限付与を行っていた手順に加えて、ROLEというアクセス権限のコレクションを扱えるようになりました。

create userでユーザ作成

ユーザ作成は、従来通り以下の構文で作成可能です。

mysql> create user user0@localhost IDENTIFIED BY 'user0_password';
Query OK, 0 rows affected (0.04 sec)

MySQL5.7では可能だった「GRANT文でユーザ作成と権限付与を同時に実行」ができなくなりました。以下のとおりSyntaxエラーとなります。

mysql> GRANT ALL PRIVILEGES ON employees.* to user1@localhost IDENTIFIED BY 'user1_password';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTIFIED BY 'user1_password'' at line 1

create roleでROLE作成

ROLEによる権限付与をおこなうには、まず以下のようにROLEの作成をおこないます。

mysql> create role select_only@localhost;
Query OK, 0 rows affected (0.01 sec)

mysql> select User,Host from mysql.user;
+------------------+-----------+
| User             | Host      |
+------------------+-----------+
| root             | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
| select_only      | localhost |
+------------------+-----------+

ROLEは、userと同じくmysql.userテーブルに格納されます。上記の例では、インストール直後にデフォルトで作成されるユーザに加えて、select_onlyというROLEが格納されているのが確認できます。

grant文でROLEに権限付与、ROLEをユーザに付与

GRANT文にて、ROLE「select_only」に、employeesデータベースの全テーブルへのselect権限を付与します。

mysql> grant select on employees.* to select_only@localhost;
Query OK, 0 rows affected, 1 warning (0.04 sec)

ROLE「select_only@localhostname」を、user0@localhostに付与します。

mysql> grant select_only@localhost to user0@localhost;
Query OK, 0 rows affected (0.03 sec)

ROLEは、userと全く同じ扱いなので、以下のSQLで「user0@localhostと全く同じ権限をuser1@localhostに付与する」ことも可能です。

mysql> grant user0@localhost to user1@localhost;
Query OK, 0 rows affected (0.03 sec)

付与された権限は、show grantsで確認できます。

mysql> show grants for user0@localhost;
+--------------------------------------------------------+
| Grants for user0@localhost                             |
+--------------------------------------------------------+
| GRANT USAGE ON *.* TO `user0`@`localhost`              |
| GRANT `select_only`@`localhost` TO `user0`@`localhost` |
+--------------------------------------------------------+

default roleの設定

実は、grantで権限を付与しただけではアクセスが可能になりません。default roleというログイン時に設定されるロールを設定する必要があります。

mysql> set default role select_only@localhost to user0@localhost;
Query OK, 0 rows affected (0.09 sec)

新しく作成されたユーザ「user0」でログインしなおしてみます。

ログインできたことと、current_role()がselect_only@localhostであることを確認できました。

# mysql -u user0 -puser0_password;
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.19 MySQL Community Server - GPL

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

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 current_role();
+---------------------------+
| current_role()            |
+---------------------------+
| `select_only`@`localhost` |
+---------------------------+
1 row in set (0.00 sec)

実際にemployeesデータベースのemployeesテーブルにselect文でアクセスできました。

mysql> select * from employees.employees limit 10;
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  |
+--------+------------+------------+-----------+--------+------------+
|  10001 | 1953-09-02 | Georgi     | Facello   | M      | 1986-06-26 |
|  10002 | 1964-06-02 | Bezalel    | Simmel    | F      | 1985-11-21 |
|  10003 | 1959-12-03 | Parto      | Bamford   | M      | 1986-08-28 |
|  10004 | 1954-05-01 | Chirstian  | Koblick   | M      | 1986-12-01 |
|  10005 | 1955-01-21 | Kyoichi    | Maliniak  | M      | 1989-09-12 |
|  10006 | 1953-04-20 | Anneke     | Preusig   | F      | 1989-06-02 |
|  10007 | 1957-05-23 | Tzvetan    | Zielinski | F      | 1989-02-10 |
|  10008 | 1958-02-19 | Saniya     | Kalloufi  | M      | 1994-09-15 |
|  10009 | 1952-04-19 | Sumant     | Peac      | F      | 1985-02-18 |
|  10010 | 1963-06-01 | Duangkaew  | Piveteau  | F      | 1989-08-24 |
+--------+------------+------------+-----------+--------+------------+

delete文を実行しようとすると、権限がない(command denied)エラーが起こります。

mysql> delete from employees.employees;
ERROR 1142 (42000): DELETE command denied to user 'user0'@'localhost' for table 'employees'

ROLEの剥奪は、revokeを使用

user0@localhostから、ROLE「select_only」を剥奪するには、以下のようにします。

mysql> revoke select_only@localhost from user0@localhost;
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for user0@localhost;
+-------------------------------------------+
| Grants for user0@localhost                |
+-------------------------------------------+
| GRANT USAGE ON *.* TO `user0`@`localhost` |
+-------------------------------------------+
1 row in set (0.00 sec)

show grantsで、ROLEがなくなっていることが確認できました。

まとめ

ポテパンダの一言メモ
  • create roleでROLE作成
  • grantでROLEを付与、revokeでROLEを剥奪可能
  • MySQL 8.0以降では、grant文でユーザ作成と権限付与を自動に実行することはできなくなった

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。