题
我正在考虑将触发器用作MySQL(第5.1节)中的记录机构,因此我希望触发器以获取查询字符串以将其存储在另一个TABE中。
我在MySQL文档中找不到类似的东西,所以我希望答案是否定的 - 但我仍然希望我忽略了一些东西。
PS:这个问题与 Icarusnm回答我的问题“记录MySQL DB更改查询和用户”
解决方案
我有一个工作理论(Laforge会对Picard上尉说)。..
由于您使用的是MySQL 5.1,因此您可以访问该表格 信息_SCHEMA.PROCESSLIST.
您还可以访问触发器正在运行的当前过程的ID。获得该过程ID的功能是 Connection_ID.
您可以尝试这样的查询:
SELECT info FROM INFORMATION_SCHEMA.PROCESSLIST WHERE id = CONNECTION_ID();
请记住 info
是longtext:
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();
试试看 !!!
如果有效,那
做到这一点(上尉Picard会回到Laforge)
其他提示
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