寻找触发语句

Finding the triggering statement

我想在MySQL中写一个触发器,它会记录下导致触发器触发的语句。我知道如何在 Oracle 中执行此操作:

n := ora_sql_txt(sql_text);
for i in 1..n loop
  stmt := stmt || sql_text(i);
end loop;

但我在 MySQL 中找不到等效项。

导致触发触发器的语句的 SQL 文本可能在 information_schema 数据库的 processlist table 中可用。

例如可能是这样的(未测试)

DECLARE ls_pl_info VARCHAR(65536);

SELECT pl.info
  INTO ls_pl_info  
  FROM information_schema.processlist pl
 WHERE pl.id = CONNECTION_ID() ;

-或者也许-

SELECT t.processlist_info
  INTO ls_pl_info  
  FROM performance_schema.threads t
 WHERE t.processlist_id = CONNECTION_ID() ; 

(我不确定也没有测试过的是,信息列是否会包含触发触发器的语句的 SQL 文本,或者是否会显示文本current 语句的一部分,它正在访问进程列表 table。)

但这是我能想到的最接近的;我认为导致触发器触发的语句文本在触发器中不可用。

参考文献:

https://dev.mysql.com/doc/refman/5.7/en/processlist-table.html

https://dev.mysql.com/doc/refman/5.7/en/thread-information.html

注意:如果 general_log 已启用(我们的系统通常不会启用它;我们通常只是暂时启用它以收集一小段时间的信息...)但我不认为触发语句将在通用日志中可用,直到它完成后,这意味着触发的触发器完成后。

另一个选项是二进制日志(如果启用了二进制日志)。但是从触发器内部获取它似乎过于复杂。