Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL Trigger obtém a consulta atual que causou o disparo do gatilho


O problema aqui é que o escopo dos gatilhos do MySQL é em nível de linha, não em nível de instrução. Assim, dentro do gatilho, você tem acesso aos valores OLD e NEW para cada coluna na linha fornecida, mas não tem acesso à instrução que fez o gatilho disparar.

Em relação a information_schema.processlist, nada é realmente "armazenado" (persistente) nessa exibição. É apenas uma interface SQL para a lista de processos, e a instrução que causou o disparo do gatilho não está acessível no escopo do gatilho.

Você disse que não deseja habilitar o log de consulta geral e essa abordagem não é perfeita por vários motivos (incluindo a granularidade de event_Time sendo 1 segundo), mas aqui está um exemplo de como você pode reescrever seu gatilho usando o tabela general_log:
SET GLOBAL GENERAL_LOG='ON';
SET GLOBAL LOG_OUTPUT='TABLE';

DELIMITER || 

CREATE TRIGGER DEBUG_DATE BEFORE UPDATE ON db.tbl FOR EACH ROW 
BEGIN 
  DECLARE Q MEDIUMTEXT; 
  SELECT argument INTO Q 
  FROM mysql.general_log 
  where thread_id = connection_id() 
  order by event_time desc 
  limit 1;

  INSERT INTO db.tbl_log (INFO) 
  VALUES (Q); 

END ||

DELIMITER ;