質問: mysqlについて質問です。 (前提条件) 1.実行ユーザーのホストは、「%」のみが存在している 2.「実行ユーザー@%」の権限 SELECT INSERT UPDATE DELETE LOCK TABLES CREATE ROUTINE ALTER ROUTINE SUPER(追記) 3.MYSQLサーバのバージョン 5.6.21 (起きている現象) クライアントから、mysqlコマンドを使用して、functionのcreate文を実行すると 「実行ユーザー@クライアントIPアドレス」が自動で作成されます。 以降、権限が何もない状態となり何もできなくなる。 (コマンド) mysql -h $MYSQL_HOST -u $MYSQL_USER hogedb < create_function.sql (クエリ) DELIMITER ;; DROP FUNCTION IF EXISTS `fn_hoge`;; CREATE DEFINER=`root`@`localhost` FUNCTION `fn_hoge`( ) RETURNS int(11) DETERMINISTIC BEGIN //処理 END; (質問) 1.何故、ユーザーのホストが追加されてしまうのか? 2.ユーザーのホストが追加されずに済む方法があるか?
回答: 手元にMySQLもなく再現も検証もしてなくて申し訳ないが automatic_sp_privilegesというやつじゃないだろうか? user@%でもこれはただホスト部がワイルドカードなだけで実際にはアクセス元ホストのユーザーとして認識されてるからこの効果により作成されちゃうんじゃないか?とりあえず0に設定してみたらうまくいくかもしれない。 ただの推測だから間違ってたらごめんよ。 #### 以下追記 検証してみた結果、 `automatic_sp_privileges`がONかつホスト部がワイルドカードのユーザーに対して`EXECUTE`もしくは`ALTER ROUTINE`のどちらかが足りない場合は、実際の接続元ホストのユーザーが作成され、それに対して`EXECUTE`と`ALTER ROUTINE`が付与されるね。 よってもしこれが原因であった場合の解決策は`automatic_sp_privileges`をOFFにする: ``` set global automatic_sp_privileges=0; ``` かもしくはホスト部が'%'のユーザーに対してあらかじめ`EXECUTE`と`ALTER ROUTINE`を与えておく: ``` grant execute, alter routine on yourdb.* to 'user'@'%'; ``` 再現したんだけどねー。新しくユーザー作るわけだからこのレポートにもあるようにcreate functionするユーザーにmysql.userテーブルに対するinsert権限が必要なわけよ。質問文のやつにはそんなの書いてないじゃん?あと検証するにあたってdefiner=root@localhostとするならsuper権限必要だったし。なんか書いてあるのとは別に豪華な権限与えてる? だから原因がこれかは正直わかんね。とりあえずcreate functionするユーザーへの権限付与が適切じゃないんじゃね?