Mysql 查找触发语句

Mysql 查找触发语句,mysql,database-trigger,Mysql,Database Trigger,我想在MySQL中编写一个触发器,它将记录触发触发器的语句。我知道如何在Oracle中做到这一点: n := ora_sql_txt(sql_text); for i in 1..n loop stmt := stmt || sql_text(i); end loop; 但是我在MySQL中找不到等价的语句。导致触发的语句的SQL文本可能在information\u schema数据库的processlist表中可用 e、 g.也许像这样的东西没有经过测试 DECLARE ls_pl_in

我想在MySQL中编写一个触发器,它将记录触发触发器的语句。我知道如何在Oracle中做到这一点:

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

但是我在MySQL中找不到等价的语句。

导致触发的语句的SQL文本可能在information\u schema数据库的processlist表中可用

e、 g.也许像这样的东西没有经过测试

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() ; 
我不确定,也没有测试的是,info列是否包含触发触发器的语句的SQL文本,或者是否将显示当前语句的文本,该语句正在访问processlist表

但那是我能到达的最近的地方;我不相信导致触发器触发的语句的文本在触发器中可用

参考资料:

注意:如果启用了常规日志,而这在我们的系统上通常不启用;我们通常只允许它在短时间内临时收集信息。。。但我不知道;我不认为触发器语句在完成之前(也就是说在触发触发器完成之后)在常规日志中可用


如果启用了二进制日志记录,另一个选项是二进制日志。但从触发器内部实现这一点似乎过于复杂了。

它不起作用!保存的语句是您编写的select语句,而不是发出的update语句。我在发布的SQL中没有看到语法错误。显然,触发器中的语句序列有限制。。。DECLARE语句必须在其他语句之前。。。用户必须对information_schema.processlist表具有SELECT权限,并且触发器主体中有分号,我们需要为CREATE trigger语句指定不同的语句分隔符,…我不确定info列将包含什么,因为我们正在运行SELECT以从表中检索行,我想SELECT应该在processlist表中,而不是触发语句中。也许其他人有一种聪明的方法可以从触发器中获取导致触发器被触发的语句的SQL文本。但根本不清楚我们为什么要在触发器中使用它;触发器将如何处理它。也许有其他方法可以解决我们试图解决的问题,而不需要SQL语句的实际文本。MySQL说:1064-您的SQL语法有错误;查看与MySQL服务器版本对应的手册,以了解在“DECLARE ls_pl_info VARCHAR65536”附近使用的正确语法;在第1行的ls_pl_info FRO'中选择pl.info。尽管出现了所有错误,我还是在不知道违规语句的情况下解决了问题。这个解决方案不正确,但它是一个很好的起点。所以我会接受的。