2012-05-18 72 views
1

我已经在寻找一个解决方案搜罗网上寻找过去的4个小时,但所有我能找到的是:MySQL的触发获取当前的查询导致触发器触发

你不能。 不可能。 不会发生。

我不喜欢那种方法。

我的理论是,如果它被存储在information_schema.processlist中的某个点上,那么就必须要抓住它。 我试图在processlist表上运行一个触发器,但无法让它工作,我想是因为它的一个视图。 运行日志不是一个选项,因为这将影响性能已在服务器上,以及有许多查询运行,我只希望它登录在特定的表,然后只在更新..

这是传奇的stackoverflow!在那里你可以找到解决所有你的问题,因为它与天才溢出!

所以,我求求你,天才在哪里!展示你自己! :-)

感谢, 捷德

+0

我已经试过这个,我成功地获得了在sql server 2000中工作但不在mysql中的代码。 –

回答

0
SELECT INFO FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ... ; 
+0

这不起作用。我努力了。这里是我尝试过的触发器:DELIMITER || CREATE TRIGGER DEBUG_DATE BEFORE UPDATE ON db.tbl FOR EACH ROW BEGIN \t DECLARE Q VARCHAR(1024); \t SELECT INFO INTO Q FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID(); \t INSERT INTO db.tbl_log(INFO)VALUES(Q); END || – Zedd

+0

@ user1403127:你得到了什么错误?您可能会得到多个结果(至少一个用于调用触发器的'UPDATE'命令,另一个用于触发器正在运行的'SELECT INFO FROM INFORMATION_SCHEMA.PROCESSLIST'命令),您无法分配给它你的'Q'变量。为什么不只是'INSERT INTO db.tbl_log(INFO)SELECT INFO FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID();'?或者在你的'WHERE'子句中选择性更强(考虑过滤'COMMAND'和/或'STATE')? – eggyal

+0

我也试过这个...但它导致了同样的事情......它只是插入到tbl_log最后一次运行的查询中...... whcih是select from proceslist – Zedd

1

这里的问题是,MySQL的触发范围是行级,而不是语句级。因此,在触发器内,您可以访问给定行中每列的OLD和NEW值,但是您无权访问导致触发器触发的语句。

关于information_schema.processlist,在该视图中实际上没有任何内容被“存储”(持久化)。它只是流程列表的SQL接口,并且触发器范围内无法访问导致触发器触发的语句。

你说你不想启用一般查询日志,并且这种方法并不完美,因为多种原因(包括event_Time的粒度为1秒),但这里有一个例子说明如何重写使用general_log表的触发器:

SET GLOBAL GENERAL_LOG='ON'; 
SET GLOBAL LOG_OUTPUT='TABLE'; 

DELIMITER || 

CREATE TRIGGER DEBUG_DATE BEFORE UPDATE ON db.tbl FOR EACH ROW 
BEGIN 
    DECLARE Q MEDIUMTEXT; 
    SELECT argument INTO Q 
    FROM mysql.general_log 
    where thread_id = connection_id() 
    order by event_time desc 
    limit 1; 

    INSERT INTO db.tbl_log (INFO) 
    VALUES (Q); 

END || 

DELIMITER ; 
0

我们研究这个问题,并发现,“声明”并不样本上方, 也general_log标志应在服务器上启用的工作。最后,我们有以下 触发代码:

DELIMITER $$ 

DROP TRIGGER IF EXISTS `our_trigger`$$ 
CREATE TRIGGER `our_trigger` 
BEFORE UPDATE ON `our_table_for_debug` 
FOR EACH ROW BEGIN 

SELECT argument INTO @tquery FROM mysql.general_log where thread_id = connection_id() and argument like 'update%' order by event_time desc limit 1; 
INSERT INTO `our_log_table` (`query`) VALUES (@tquery); 

END IF; 

END$$ 

DELIMITER ; 

“our_log_table”是表命名query单MEDIUMTEXT场。 要启用通用日志,您应该运行此查询:general_log = 1;或直接在mysql设置中启用它 。