質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

1回答

3655閲覧

mysqlでcreate functionを実行すると自動で作成されるユーザーのホストについて

KaiheiSameshima

総合スコア10

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2016/03/25 09:08

編集2016/03/30 07:27

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.ユーザーのホストが追加されずに済む方法があるか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

手元にMySQLもなく再現も検証もしてなくて申し訳ないが
automatic_sp_privilegesというやつじゃないだろうか?
user@%でもこれはただホスト部がワイルドカードなだけで実際にはアクセス元ホストのユーザーとして認識されてるからこの効果により作成されちゃうんじゃないか?とりあえず0に設定してみたらうまくいくかもしれない。
ただの推測だから間違ってたらごめんよ。

以下追記

検証してみた結果、
automatic_sp_privilegesがONかつホスト部がワイルドカードのユーザーに対してEXECUTEもしくはALTER ROUTINEのどちらかが足りない場合は、実際の接続元ホストのユーザーが作成され、それに対してEXECUTEALTER ROUTINEが付与されるね。
よってもしこれが原因であった場合の解決策はautomatic_sp_privilegesをOFFにする:

SQL

1set global automatic_sp_privileges=0;

かもしくはホスト部が'%'のユーザーに対してあらかじめEXECUTEALTER ROUTINEを与えておく:

SQL

1grant execute, alter routine on yourdb.* to 'user'@'%';

再現したんだけどねー。新しくユーザー作るわけだからこのレポートにもあるようにcreate functionするユーザーにmysql.userテーブルに対するinsert権限が必要なわけよ。質問文のやつにはそんなの書いてないじゃん?あと検証するにあたってdefiner=root@localhostとするならsuper権限必要だったし。なんか書いてあるのとは別に豪華な権限与えてる?
だから原因がこれかは正直わかんね。とりあえずcreate functionするユーザーへの権限付与が適切じゃないんじゃね?

投稿2016/03/25 12:03

編集2016/03/28 02:50
..iilllii..

総合スコア48

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KaiheiSameshima

2016/03/28 03:09 編集

ありがとうございます。 こちらでもやってみました! automatic_sp_privilegesを無効にした結果、以下の権限を与える事で ユーザーが作成されることは回避できました。 ・LOCK TABLES ・CREATE ROUTINE ・ALTER ROUTINE ・SUPER ※SUPERに関しては、SET GLOBAL log_bin_trust_function_creators = 'ON';を サーバ側の設定を変更して、試してみましたが、それでも要求されてしまって、とりあえず与えております。 (サーバの再起動が必要なのかも・・・今、簡単に再起動できないので確認取れておりません) おっしゃる通り、SUPER権限の問題が残ったのですが 自動でユーザーが作成される状態は回避できています。
..iilllii..

2016/03/28 03:19

えーとね。ちゃんと回答読んで、automatic_sp_privilegesについて調べて、create function文の公式のマニュアルを読みふけって適切な設定してくれたらうれしいな。 superは直接は関係ないから。あとautomatic_sp_privilegesをOFF「もしくは」execute+alter routineだから。 さらにmysql.userにinsert権限なければwarningがでてユーザーつくられねーから。insert on *.*やってんじゃないだろうな。 まあ原因が最初の推測通りだったようだからそれがわかって俺は大体満足だ。
KaiheiSameshima

2016/03/30 07:28

回答者様のご指摘で再度確認したところ、SUPER権限も付与した際に発生していました。 混乱させてしまい申し訳ありませんでした。 回答ありがとうございました。助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問