質問

トリガーをMySQLのロギングメカニズムとして使用することを考えています(v。5.1)。したがって、別のTabeに保存するために、クエリ文字列を取得してもらいたいと考えています。

MySQLのドキュメントでそのようなものが見つからなかったので、答えはノーであると思いますが、それでも何かを見落としていることを願っています。

PS:この質問はに関連しています 私の質問に対するicarusnmの答え「ログmysql dbクエリとユーザーの変更」

役に立ちましたか?

解決

私には実用的な理論があります(ラフォージはキャプテン・ピカードに言うでしょう)。..

MySQL 5.1を使用しているため、テーブルにアクセスできます Information_schema.processlist.

また、トリガーが実行されている現在のプロセスのIDにアクセスできます。そのプロセスIDを取得する機能はです Connection_id.

あなたはこのようなクエリを釣り出そうとすることができます:

SELECT info FROM INFORMATION_SCHEMA.PROCESSLIST WHERE id = CONNECTION_ID();

そのことに留意してください info ロングテキストです:

mysql> show create table information_schema.processlist\G
*************************** 1. row ***************************
       Table: PROCESSLIST
Create Table: CREATE TEMPORARY TABLE `PROCESSLIST` (
  `ID` bigint(4) NOT NULL DEFAULT '0',
  `USER` varchar(16) NOT NULL DEFAULT '',
  `HOST` varchar(64) NOT NULL DEFAULT '',
  `DB` varchar(64) DEFAULT NULL,
  `COMMAND` varchar(16) NOT NULL DEFAULT '',
  `TIME` int(7) NOT NULL DEFAULT '0',
  `STATE` varchar(64) DEFAULT NULL,
  `INFO` longtext
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

トリガー内では、ローカル変数を使用してクエリを保持できます

DECLARE original_query VARCHAR(1024);

そして、クエリをキャプチャします

SELECT info INTO original_query FROM INFORMATION_SCHEMA.PROCESSLIST WHERE id = CONNECTION_ID();

試してみる !!!

それが機能する場合、そうです

それを作る(キャプテン・ピカードはラフォージに戻ってくるだろう)

他のヒント

DROP TRIGGER IF EXISTS DEBUG_TIGGER;
CREATE TRIGGER DEBUG_TIGGER
AFTER UPDATE ON my_table 
FOR EACH ROW 
BEGIN
    INSERT INTO log_my_table(query)
    SELECT argument 
    FROM mysql.general_log 
    WHERE thread_id = connection_id()
    ORDER BY event_time DESC 
    LIMIT 5; /*gives last 5 queries(this will help you get idea of what logical path was taken)*/

    INSERT log_my_table
    (query)
    VALUES('-----------------');/*empty place holder*/
END
ライセンス: CC-BY-SA帰属
所属していません dba.stackexchange
scroll top