如何使用MySQL触发器按操作分组数据更改

如何使用MySQL触发器按操作分组数据更改,mysql,logging,triggers,Mysql,Logging,Triggers,我在MySQL中使用触发器记录对数据的更改。这些更改记录在行级别。现在,我可以在日志表中为更改的每一行插入一个条目。但是,我还需要记录更改所属的操作 例如,像“从type=x的表中删除*”这样的删除操作可以删除多行。使用触发器,我可以将每个已删除行的条目插入到日志表中,但我还希望为整个操作提供一个唯一标识符,以便日志表看起来像: log_id operation_id tablename fieldname oldvalue newvalue 1 1

我在MySQL中使用触发器记录对数据的更改。这些更改记录在行级别。现在,我可以在日志表中为更改的每一行插入一个条目。但是,我还需要记录更改所属的操作

例如,像“从type=x的表中删除*”这样的删除操作可以删除多行。使用触发器,我可以将每个已删除行的条目插入到日志表中,但我还希望为整个操作提供一个唯一标识符,以便日志表看起来像:

log_id  operation_id  tablename  fieldname  oldvalue  newvalue

1       1             table      id         1         null  
2       1             table      type       a         null
3       1             table      id         2         null
4       1             table      type       a         null
5       2             table      id         3         null  
6       2             table      type       b         null
7       2             table      id         4         null
8       2             table      type       b         null
MySQL中有没有办法识别行更改所属的更高级别的操作?或者,这只能通过应用程序级代码实现吗?将来,能够记录操作所属的事务也会很好

另一个问题是,除了使用查询日志之外,是否还可以捕获实际的SQL查询。我自己也不这么认为,但也许我错过了什么。当然可以在应用程序级别捕获这些,但目标是尽可能减少对应用程序级别代码的入侵

当MySQL无法做到这一点时,其他数据库系统如何做到这一点?对于当前的项目来说,除了MySQL之外,不能使用其他东西,但是对于未来的项目来说,知道这一点会很好

编辑 在伪代码中,我希望实现以下类型的触发器:

CREATE TRIGGER tablename_log_insert
AFTER INSERT ON tablename
INSERT INTO log_operations (operation_type, relation) VALUES ('insert', 'tablename');
SET @operation_id = LAST_INSERT_ID();
FOR EACH ROW
BEGIN
    INSERT INTO log_tablename(@operation_id, ...) VALUES (@operation_id, ...);
END;

我知道这对于MySQL是不正确的,但也许这个伪代码有助于澄清我的问题。

基于触发器的创建,您知道一些上下文:删除、插入、更新

CREATE TRIGGER  <name_of_trigger>  
   [BEFORE | AFTER] 
   [UPDATE | INSERT | DELETE] -- Dictates context for trigger 'action'.
ON <table_name>
FOR EACH ROW BEGIN
  <SQL to execute>
END
当记录表修改时,您可以开始讨论BEFORE和AFTER。。。我们发现,使用“after”值可以有效地使日志与“binary log”相同,并且可以用于重建(包括最后一次修改)用于记录的表


--J Jorgenson--

基于触发器的创建,您知道一些上下文:删除、插入、更新

CREATE TRIGGER  <name_of_trigger>  
   [BEFORE | AFTER] 
   [UPDATE | INSERT | DELETE] -- Dictates context for trigger 'action'.
ON <table_name>
FOR EACH ROW BEGIN
  <SQL to execute>
END
当记录表修改时,您可以开始讨论BEFORE和AFTER。。。我们发现,使用“after”值可以有效地使日志与“binary log”相同,并且可以用于重建(包括最后一次修改)用于记录的表


--J Jorgenson--

使用MySQL,它使您能够捕获已执行的确切语句。您可以选择是否将其写入文件或表。

使用MySQL,它使您能够捕获已执行的确切语句。您可以选择是否将其写入文件或表。

为什么不使用查询日志?我需要在实时数据库的触发器中分配操作ID,以后我不想使用日志。您可以登录到(实时)表。。。看,我不知道。我现在就去调查一下。Thx的链接!没问题。如果它解决了你的问题,我会升级到一个答案。在最坏的情况下,您可能可以将其与基于触发器的方法结合起来,以获得最终想要的结果。为什么不使用查询日志?我需要在实时数据库的触发器中分配操作ID,我不想在事后使用日志。您可以登录到(实时)表。。。看,我不知道。我现在就去调查一下。Thx的链接!没问题。如果它解决了你的问题,我会升级到一个答案。在最坏的情况下,您可能会将其与基于触发器的方法结合起来,以实现您最终的需求。一旦我被允许这样做,我将立即奖励赏金。我有一个有效的实现,所以感谢你的帮助。一旦我被允许这样做,我将立即奖励赏金。