teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

検証結果

2016/03/28 02:50

投稿

..iilllii..
..iilllii..

スコア48

answer CHANGED
@@ -1,4 +1,20 @@
1
1
  手元にMySQLもなく再現も検証もしてなくて申し訳ないが
2
2
  [automatic_sp_privileges](https://dev.mysql.com/doc/refman/5.6/ja/stored-routines-privileges.html)というやつじゃないだろうか?
3
3
  user@%でもこれはただホスト部がワイルドカードなだけで実際にはアクセス元ホストのユーザーとして認識されてるからこの効果により作成されちゃうんじゃないか?とりあえず0に設定してみたらうまくいくかもしれない。
4
- ただの推測だから間違ってたらごめんよ。
4
+ ただの推測だから間違ってたらごめんよ。
5
+
6
+ #### 以下追記
7
+
8
+ 検証してみた結果、
9
+ `automatic_sp_privileges`がONかつホスト部がワイルドカードのユーザーに対して`EXECUTE`もしくは`ALTER ROUTINE`のどちらかが足りない場合は、実際の接続元ホストのユーザーが作成され、それに対して`EXECUTE`と`ALTER ROUTINE`が付与されるね。
10
+ よってもしこれが原因であった場合の解決策は`automatic_sp_privileges`をOFFにする:
11
+ ```SQL
12
+ set global automatic_sp_privileges=0;
13
+ ```
14
+ かもしくはホスト部が'%'のユーザーに対してあらかじめ`EXECUTE`と`ALTER ROUTINE`を与えておく:
15
+ ```SQL
16
+ grant execute, alter routine on yourdb.* to 'user'@'%';
17
+ ```
18
+
19
+ 再現したんだけどねー。新しくユーザー作るわけだから[このレポート](https://bugs.mysql.com/bug.php?id=77929)にもあるようにcreate functionするユーザーにmysql.userテーブルに対するinsert権限が必要なわけよ。質問文のやつにはそんなの書いてないじゃん?あと検証するにあたってdefiner=root@localhostとするならsuper権限必要だったし。なんか書いてあるのとは別に豪華な権限与えてる?
20
+ だから原因がこれかは正直わかんね。とりあえずcreate functionするユーザーへの権限付与が適切じゃないんじゃね?