質問: MySQL(ver5.6)であるテーブルにたいして更新クエリ―をかけてきたホストのIPあるいはホスト名を何らかの方法で取得し、別に用意したログ用テーブルにIP又はホスト名,タイムスタンプ、更新前のレコードの値をインサーとするトリガーを作りたいと考えています。 しかし、トリガー内でテーブルの更新クエリ―をかけたホストのIPを取得する方法が分かりません。 できればユーザー名もわかればありがたい。 トリガーに関する文法は理解していますが、ホストのIPの取得方法、関係するテーブルあるいはビューとカラム名が分かりません。 どなたか、教えていただければ幸いです。
回答: tacsheavenさん、ありがとうございました。 おかげさまで、自己解決しました。 MySQL5.6リファレンスマニュアルに参考となる記述を見つけました。 https://dev.mysql.com/doc/refman/5.6/ja/information-functions.html 「トリガーおよびイベントには、SQL SECURITY 特性を定義するためのオプションがありません。したがって、このようなオブジェクトの場合、CURRENT_USER() はオブジェクトを定義したユーザーのアカウントを返します。呼び出したユーザーを返すには、USER() または SESSION_USER() を使用します。」 そこで、トリガー内のselectのWHERE句を以下のように変更したところ、トリガーを起動した接続ユーザーの情報を特定できました。 (変更前)SELECT user, host INTO @host_user,@host_IP FROM information_schema.processlist WHERE id = connection_id(); (変更後)SELECT user, host INTO @host_user,@host_IP FROM information_schema.processlist WHERE user = LEFT(USER(),INSTR(USER(),'@')-1) LIMIT 1; create文は以下の通り CREATE DEFINER=`root`@`localhost` TRIGGER `table_AFTER_UPDATE` AFTER UPDATE ON `table` FOR EACH ROW BEGIN SELECT user, host INTO @host_user,@host_IP FROM information_schema.processlist WHERE user = LEFT(USER(),INSTR(USER(),'@')-1) LIMIT 1; INSERT INTO table_log ( host_user, host_IP, event, ......) VALUES ( @host_user, @host_IP, "UPDATE", ......); END