我想在MySQL中编写一个触发器,它会记录导致触发器触发的语句。我知道如何在Oracle中执行此操作:
n := ora_sql_txt(sql_text);
for i in 1..n loop
stmt := stmt || sql_text(i);
end loop;
但我无法在MySQL中找到相应的内容。
答案 0 :(得分:0)
导致触发器触发的语句的SQL文本可能在processlist
数据库的information_schema
表中可用。
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文本,或者是否会显示当前语句的文本,它正在访问进程列表表。)
但那是我能来的最近的;我不相信触发器触发的语句文本在触发器中可用。
参考文献:
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
已启用(我们的系统通常不会启用此功能;我们通常只会暂时启用它以在短时间内收集信息...)但我不认为触发语句将在常规日志中提供,直到完成后,这意味着在触发的触发器完成后。
另一个选项是二进制日志(如果启用了二进制日志记录)。但是从触发器内部开始这样做似乎很复杂。