查找触发触发器的查询

Finding Query that Triggered a Trigger

是否可以使用触发器获取触发它的查询或查询的主要 ID?

目前我们大致有:

Delete from Table1 where id = 1

id 是 table 的主 ID,1 只是一个示例记录)

我想记录查询或被删除行的 id(因为有人错误地删除了记录(非恶意))。使用 triggerBEFORE DELETE ON 这似乎是一个简单的过程,但我不知道如何解决导致 trigger 触发的父查询。

我计划:

DELIMITER $$
    CREATE TRIGGER Table1_Row_Being_Deleted
        BEFORE DELETE ON Table1
            INSERT INTO deleted_Table1 (deleting_date, tableid) values(now(), ?);
    END$$
DELIMITER;

但我不知道 ? 放什么。我见过的所有其他线程和文档都有静态值,或者影响 table.

中的每一行

触发器和触发触发器的查询之间没有直接的link。但是您可以使用 performance schema 搜索所有活动查询并记录它们。其中之一应该是来电者的查询。

create trigger Table1_Row_Being_Deleted after delete on Table1 
for each row
  insert into deleted_Table1(id, dt, user, qry) 
  select old.id, now(), user(), performance_schema.events_statements_current.sql_text
  from performance_schema.events_statements_current; 

这将记录每个活动查询,因此会产生很多噪音,因为不知道正确的查询。由于它可以是间接查询(例如来自过程),因此正确的查询并不总是包含像 'delete from table1' 这样的独特部分。因此,查找每次出现问题时都会出现在日志表中的常见查询。

我在这里使用了一个 after delete 触发器,所以它只会在 delete 成功时记录,你可能想使用 before delete 触发器来记录,即使 delete 稍后会失败(例如,由于外键约束)。

old.id(以及整行 old)包含该行在被删除之前的值(因此您仍然可以在此处使用它来记录条目)。

performance schemaevents_statements_current-log 通常默认启用。检查

的结果
select * from performance_schema.events_statements_current;

它至少应该包含一个包含此 select 查询本身的行(因为那是当时的活动查询)。如果它是空的(或者你没有使用它的权限或者它不存在),你应该检查 show variables like 'performance_schema'; 是否会显示 ON。您可能需要设置权限或一些日志记录选项,请参阅 Query Profiling Using Performance Schema