MySQL(ver5.6)であるテーブルにたいして更新クエリ―をかけてきたホストのIPあるいはホスト名を何らかの方法で取得し、別に用意したログ用テーブルにIP又はホスト名,タイムスタンプ、更新前のレコードの値をインサーとするトリガーを作りたいと考えています。
しかし、トリガー内でテーブルの更新クエリ―をかけたホストのIPを取得する方法が分かりません。
できればユーザー名もわかればありがたい。
トリガーに関する文法は理解していますが、ホストのIPの取得方法、関係するテーブルあるいはビューとカラム名が分かりません。
どなたか、教えていただければ幸いです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
自己解決
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
投稿2017/06/21 04:57
総合スコア28
0
トリガー内で取得する CONNECTION_ID() の値が、トリガーを発火させたプロセスのIDであるならば、という条件が付きますが(トリガーを起動するプロセスが違うかどうか、試していないので不明です)、
SQL
1SELECT user, host FROM information_scheme.processlist WHERE id = connection_id()
で接続側のホスト名と接続ユーザーが取れるかと思います。
投稿2017/06/14 09:41
編集2017/06/14 09:43総合スコア13703
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
mysqlの実行はどうやっていますか?
(1)コマンドラインのmysqlクライアントをご利用でしょうか?
(2)それともapacheベースのphpやperlなどで実行しますか?
(3)もしくはODBCなどを通してアプリケーションからでしょうか?
(1)であればログインユーザーやホストは特定できますのでそれを参照してください
(2)や(3)の場合、実際の実行ユーザーはrootなど管理者権限ユーザーで
クライアントはその権限をカリているだけかもしれません。
その場合各クライアントの情報は、プログラム側で抜き出すことができると思います
投稿2017/06/14 02:35
総合スコア114769
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/14 09:21
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。