查找触发触发器的查询
Finding Query that Triggered a Trigger
是否可以使用触发器获取触发它的查询或查询的主要 ID?
目前我们大致有:
Delete from Table1 where id = 1
(id
是 table 的主 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;
但我不知道 ?
放什么。我见过的所有其他线程和文档都有静态值,或者影响 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 schema
和 events_statements_current
-log 通常默认启用。检查
的结果
select * from performance_schema.events_statements_current;
它至少应该包含一个包含此 select
查询本身的行(因为那是当时的活动查询)。如果它是空的(或者你没有使用它的权限或者它不存在),你应该检查 show variables like 'performance_schema';
是否会显示 ON
。您可能需要设置权限或一些日志记录选项,请参阅 Query Profiling Using Performance Schema。
是否可以使用触发器获取触发它的查询或查询的主要 ID?
目前我们大致有:
Delete from Table1 where id = 1
(id
是 table 的主 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;
但我不知道 ?
放什么。我见过的所有其他线程和文档都有静态值,或者影响 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 schema
和 events_statements_current
-log 通常默认启用。检查
select * from performance_schema.events_statements_current;
它至少应该包含一个包含此 select
查询本身的行(因为那是当时的活动查询)。如果它是空的(或者你没有使用它的权限或者它不存在),你应该检查 show variables like 'performance_schema';
是否会显示 ON
。您可能需要设置权限或一些日志记录选项,请参阅 Query Profiling Using Performance Schema。