gpt4 book ai didi

mysql - 查找触发触发器的查询

转载 作者:行者123 更新时间:2023-11-29 07:17:22 24 4
gpt4 key购买 nike

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

目前我们大致有:

Delete from Table1 where id = 1

(id 是该表的主 ID,1 只是一个示例记录)

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

我计划:

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

但我不知道要为 添加什么内容?。我见过的所有其他线程和文档都有静态值,或者影响表中的每一行。

最佳答案

触发器和触发触发器的查询之间没有直接链接。但您可以使用性能架构来搜索所有事件查询并记录它们。其中之一应该是调用者的查询。

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;

这将记录每个事件查询,因此会产生大量噪音,因为不知道正确的查询。由于它可以是间接查询(例如,来自过程),因此正确的查询并不总是具有像“从 table1 中删除”这样的独特部分。因此,每次出现问题时,请查找日志表中的常见查询。

我在这里使用了 after delete 触发器,因此只有在 delete 成功时才会记录,您可能需要使用 before delete 触发器即使删除稍后会失败(例如由于外键约束)也会记录。

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

性能架构events_statements_current日志通常默认启用。检查结果

select * from performance_schema.events_statements_current;

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

关于mysql - 查找触发触发器的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37465903/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com