寻找触发语句
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
已启用(我们的系统通常不会启用它;我们通常只是暂时启用它以收集一小段时间的信息...)但我不认为触发语句将在通用日志中可用,直到它完成后,这意味着触发的触发器完成后。
另一个选项是二进制日志(如果启用了二进制日志)。但是从触发器内部获取它似乎过于复杂。
我想在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
已启用(我们的系统通常不会启用它;我们通常只是暂时启用它以收集一小段时间的信息...)但我不认为触发语句将在通用日志中可用,直到它完成后,这意味着触发的触发器完成后。
另一个选项是二进制日志(如果启用了二进制日志)。但是从触发器内部获取它似乎过于复杂。