是否可以使用触发器获取触发它的查询的查询或主要ID?
目前我们大致有:
Delete from Table1 where id = 1
(id
是该表的主要ID,1
只是一个示例记录)
我想记录查询或正在删除的行的id
(因为有人错误地删除了记录(非恶意))。这似乎是一个使用trigger
和BEFORE 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;
但我不知道该为?
放些什么。我见过的所有其他线程和文档都有静态值,或影响表中的每一行。
答案 0 :(得分:1)
触发器和触发触发器的查询之间没有直接链接。但您可以使用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;
这将记录每个活动查询,因此会产生大量噪音,因为未知正确的查询。由于它可以是间接查询(例如来自程序),因此正确的查询将不会总是具有与表1和#39;在里面。因此,每次出现问题时,请查找将在日志表中的常见查询。
我在这里使用了after delete
触发器,因此它只会在delete
成功时进行记录,即使before delete
将delete
,您也可能希望使用old.id
触发器进行记录稍后失败(例如因为外键约束)。
old
(以及整行performance schema
)包含该行在删除之前的值(因此您仍然可以在此处使用它来记录该条目)。
默认情况下,events_statements_current
和select * from performance_schema.events_statements_current;
- 日志通常会启用。检查结果
select
它应该至少包含一个具有此show variables like 'performance_schema';
的行 - 查询本身(因为那时是一个活动查询)。如果它是空的(或者您无权使用它或它不存在),您应该检查ON
是否会显示_.findWhere(results.attributes, {name: "Test"})
。您可能需要设置权限或一些日志记录选项,请参阅Query Profiling Using Performance Schema。