MySQL 8.0でユーザーを作成する方法

  • 2019年10月7日
  • 2019年10月7日
  • SQL

MySQL8.0絡みでまたしても躓いたので記事にします。

新しくWebアプリ用のユーザーを追加するために、いつも通り下のようなSQL文を実行しました。

GRANT ALL ON test.* TO testuser@'localhost' IDENTIFIED BY 'password123' WITH GRANT OPTION;

ところが、

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 'password123' WITH GRANT OPTION' at line 1

シンタックス…エラー…???

どこか文字が全角になってたりするのだろうな~と最初はおもって何度も確認したのですが、特におかしな点は見つからず…

ちなみに後で同じSQL文を他のMySQL 5系のMySQLサーバーで試してみたところ

mysql> GRANT ALL ON test.* TO testuser@'localhost' IDENTIFIED BY 'password123' WITH GRANT OPTION;
Query OK, 0 rows affected (0.06 sec)

こんな感じで普通に通りました。

いやな予感がして調べたところ、ある事実が発覚。

MySQL8.0ではGRANT構文でユーザを作成できない – guro_chanの手帳

上記記事によると、いままではそれとなくGRANT構文でユーザーも一緒に作成できてしまう挙動だったものを、 MySQL 8.0では明確にできないように変更したのだとか…

ではどうすればいいのか、という話ですが、下記のような2行のSQL文を実行することで、同様の操作を行うことができます。

create user 'ユーザー名'@'アクセスを許可するアクセス元IPもしくはホスト名' identified by 'パスワード';
grant all on アクセスを許可するDB名.アクセスを許可するテーブル名 to '1行目で指定したユーザー名'@'一行目で指定したアクセス元IPもしくはホスト名' with grant option;

最初に書いたSQL文をこの形式に変換すると下記のようになります。

create user 'testuser'@'localhost' identified by 'password123';
grant all on test.* to 'testuser'@'localhost' with grant option;

実行してみます。

MySQL [(none)]> create user 'testuser'@'localhost' identified by 'password123';
Query OK, 0 rows affected (0.05 sec)

MySQL [(none)]> grant all on test.* to 'testuser'@'localhost' with grant option;
Query OK, 0 rows affected (0.00 sec)

こんどはちゃんと通りましたね。

リモート接続や指定されたDB以外はuseできないかなども確認しましたが、ちゃんと意図したとおりの動作になることを確認できました。

こんごはこちらのSQL文を使っていけば問題なさそうですね。

しかし、今まで使えていたSQL文を突然使用不能にした上に、警告メッセージもなくただシンタックスエラーにしてしまうというのは…なかなか乱暴な気がします…(汗

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG