DB を設定するときは、通常次のユーザーを作成します。
CREATE USER myuser@localhost IDENTIFIED BY 'pa$$w0rd';
次に、ユーザーに DB に対するいくつかの権限を付与します。
GRANT SELECT, INSERT, UPDATE ON dbname.* TO 'myuser'@'localhost' IDENTIFIED BY 'pa$$w0rd';
これを行う方法として、この 2 つのコマンド シーケンスがあちこちで見られます。ただし、CREATE USER コマンドをスキップして GRANT で開始すると、ユーザーは自動的に作成され、正常に動作するようです。
GRANT の前に CREATE USER を使用する必要がある理由はありますか?それとも、下位互換性のための古い慣例なのでしょうか?
------------------------
MySQL は、ユーザーに権限を付与するだけで暗黙的なユーザーの作成をサポートしていました。この使用法により、GRANT が可能になりました。冪等でレプリケーションが安全です。たとえば、ユーザーがレプリカに存在する場合と存在しない場合がある場合、ユーザーがまだ存在しない場合、GRANT はユーザーを作成します。ユーザーが存在した場合でも、GRANT は機能し、必要に応じて権限を追加します。
この方法で GRANT を使用した場合、IDENTIFIED BY 句を使用してパスワードを設定することはオプションでした。ユーザーがすでに存在する場合、ユーザーはすでにパスワードを持っているため、IDENTIFIED BY は必要ありません。ユーザーが存在しない場合、IDENTIFIED BY を省略すると暗黙的にユーザーが作成されますが、パスワードはありません (つまり、誰でもパスワードを入力せずにそのユーザーとしてログインできます)。
これはセキュリティ上のリスクであると考えられました。たとえば、誰かが IDENTIFIED BY なしで GRANT を使用し、ユーザー名のスペルを間違えた場合、誤って権限を持つがパスワードを持たない新しいユーザーを作成します。
GRANT ALL ON *.* TO 'ruhnett'@'%'; -- misspelled username creates new user
これにより、誰でも新しいユーザーとしてログインし、特権アクセスを取得できるようになります。
そのため、MySQL 5.7 では、GRANT を使用して暗黙的にユーザーを作成することは非推奨になりました。
CREATE USER ... IF NOT EXISTS 構文は、冪等のユーザー作成の代わりに使用されます。これにより、開発者は、いつユーザーを作成するのか、いつ既存のユーザーに権限を付与するのかをより明確にすることが奨励されます。
------------------------
ここで行っていることは MySQL 8.0 では機能しません。 GRANT コマンドでユーザーを自動的に作成する機能には、次のような機能があります。削除した場合は、最初に CREATE USER を使用する必要があります。