我正在考虑将触发器用作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
许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top