Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL Trigger ottiene la query corrente che ha causato l'attivazione del trigger

Il problema qui è che l'ambito dei trigger MySQL è a livello di riga, non a livello di istruzione. In quanto tale, all'interno del trigger hai accesso ai valori VECCHIO e NUOVO per ogni colonna nella riga specificata, ma non hai accesso all'istruzione che ha causato l'attivazione del trigger.

Per quanto riguarda information_schema.processlist, nulla è effettivamente "memorizzato" (persistente) in quella vista. È solo un'interfaccia SQL per l'elenco dei processi e l'istruzione che ha causato l'attivazione del trigger non è accessibile nell'ambito del trigger.

Hai detto che non vuoi abilitare il registro delle query generali e questo approccio non è perfetto per più motivi (inclusa la granularità di event_Time di 1 secondo), ma ecco un esempio di come potresti riscrivere il tuo trigger usando il tabella di log_generale:

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 ;