Mysql 查找触发触发器的查询

Mysql 查找触发触发器的查询,mysql,sql-delete,delete-row,database-trigger,Mysql,Sql Delete,Delete Row,Database Trigger,是否可以使用触发器获取触发它的查询或查询的主id 目前我们大致有: Delete from Table1 where id = 1 (id是该表的主要id,1只是一个示例记录) 我想记录被删除行的查询或id(因为有人不正确地删除记录(不是恶意的))。这似乎是一个简单的过程,使用触发器和在上删除之前执行,但我不知道如何处理导致触发触发器的父查询 我计划: DELIMITER $$ CREATE TRIGGER Table1_Row_Being_Deleted BEFORE

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

目前我们大致有:

Delete from Table1 where id = 1
id
是该表的主要id,
1
只是一个示例记录)

我想记录被删除行的查询或
id
(因为有人不正确地删除记录(不是恶意的))。这似乎是一个简单的过程,使用
触发器和
上删除之前执行
,但我不知道如何处理导致触发
触发器的父查询

我计划:

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; 
这将记录每个活动查询,并因此产生大量噪音,因为不知道正确的查询。因为它可以是一个间接查询(例如,来自一个过程),所以正确的查询中并不总是有一个独特的部分,如“从表1中删除”。因此,在每次出现问题时,查找日志表中的常见查询

我在这里使用了一个
删除后
触发器,因此只有当
删除
成功时才会记录,您可能希望使用
删除前
触发器记录日志,即使
删除
稍后会失败(例如,由于外键约束)

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

默认情况下,
performance schema
events\u statements\u current
-log通常处于启用状态。从中检查结果

select * from performance_schema.events_statements_current;

它至少应该包含一行,其中包含这个
select
-query本身(因为当时是一个活动查询)。如果它是空的(或者您没有使用它的权限,或者它不存在),您应该检查
是否显示“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中删除”。因此,在每次出现问题时,查找日志表中的常见查询

我在这里使用了一个
删除后
触发器,因此只有当
删除
成功时才会记录,您可能希望使用
删除前
触发器记录日志,即使
删除
稍后会失败(例如,由于外键约束)

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

默认情况下,
performance schema
events\u statements\u current
-log通常处于启用状态。从中检查结果

select * from performance_schema.events_statements_current;

它至少应该包含一行,其中包含这个
select
-query本身(因为当时是一个活动查询)。如果它是空的(或者您没有使用它的权限,或者它不存在),您应该检查
是否显示“performance_schema”之类的变量将在
上显示
。您可能需要设置权限或一些日志选项,请参阅

要删除的id是
旧的。id
。tablename是“Table1”(触发器始终属于特定的表,因此在创建触发器时您知道该tablename)。您应该对每一行使用
,否则不会记录多次删除。您无法知道哪个语句试图删除该行。即使删除之后失败(例如,由于外键),您也会记录日志,您可以在删除后使用
记录成功的删除。
您不知道哪条语句试图删除行,但这正是我需要知道的。是否没有可跟踪的系统级事件?如果在删除后使用
记录不是已经消失了,还是暂时存储在内存中,仍然可以访问?一个查询中永远不会有两条已删除的记录,因此我不需要担心一个查询中的多次删除。
old
是一个特殊的行,即使在删除后也包含该值。要跟踪您的查询,您可能需要签出
性能\u架构。事件\u语句
和/或
性能\u架构。事件\u语句\u历史
(您必须为最后一个设置一个选项),它们包含活动和过去的查询。它们不直接链接到触发器事件,但您可以通过某种方式进行链接(例如,通过时间戳,或者通过检查表名是否在字符串中,当然也可以间接删除行,因此表名可能不在querytext中,或者保存多个查询并稍后检查)是的,
old
是答案。谢谢,您应该将其作为答案发布。是的,我将其作为答案发布,并添加了有关事件日志的内容,可能也会有所帮助。将要删除的id是
旧的。id
。tablename是“Table1”(触发器始终属于特定的表,因此在创建触发器时您知道该tablename)。您应该对每一行使用
,否则不会记录多次删除。您无法知道哪个语句试图删除该行。即使之后删除失败(例如,由于f