質問
トリガーを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
所属していません dba.stackexchange