MySQLでGrant文でユーザを作成するのに違和感を感じる
MySQLの入門記事で、「GRANT文でユーザを作成します」という説明をよく見かけます。
こんなやつ。
GRANT ALL PRIVILEGES ON *.* TO 'ユーザー名'@'localhost' IDENTIFIED BY 'パスワード';
確かにこれでユーザ作成できますが、なんか違和感を感じるんですよね。
その英文からユーザが作成されるようには見えない
英語的になんかおかしい。
英語のGrant = 「許可する」でしょ?「指定したユーザに権限を与える」みたいな英文なのに、ユーザを作っちゃってる。おまけにパスワードも設定しちゃってる。
MySQLはユーザを作る別の方法として CREATE USER
というのもある。GRANTでユーザ作れるとしたら、CREATE USER
は何のためにあるの?とMySQL初心者の私は混乱してしまうわけです。
そこで公式マニュアルを読んで整理してみました。
公式マニュアルをちゃんと読んでみた
https://dev.mysql.com/doc/refman/5.6/ja/grant.html
通常、データベース管理者は最初に CREATE USER を使用してアカウントを作成し、次に GRANT を使用してその権限や特性を定義します。
おぉ、通常はCREATE USERしてからGRANTで権限を与えるのか。なるほど!!
もうこれでかなり頭がスッキリしました。 では、GRANTでユーザ作ってるあの慣習は何?
これも公式マニュアルに説明があります。
ただし、GRANT ステートメントで指定されたアカウントがまだ存在しない場合、GRANT は、あとで NO_AUTO_CREATE_USER SQL モードの説明に示されている条件の下でそのアカウントを作成する可能性があります。
なるほど、GRANTしたときにアカウントがまだ存在しない場合はある条件下でそのアカウントを作ってくれる可能性があるのね!可能性が!
ということは、「GRANTでユーザを作ります」って解説してる記事はその可能性に賭けていることになる。
そもそもCRATE USERしてからGRANTすれば、そういう「可能性」とかごちゃごちゃ考えなくてすむわけだから、やはり2文にわけるのが自然なのではないでしょうか。
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
GRANT ALL ON db1.* TO 'jeffrey'@'localhost';
CREATE USERでユーザ作ってパスワード設定する。 GRANT文は権限与えるだけに特化する。
絶対この方がわかりやすいと思いました。特に初心者のうちは。