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文を突然使用不能にした上に、警告メッセージもなくただシンタックスエラーにしてしまうというのは…なかなか乱暴な気がします…(汗