Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL Trigger obtient la requête actuelle qui a provoqué le déclenchement du déclencheur

Le problème ici est que la portée des déclencheurs MySQL est au niveau de la ligne et non au niveau de l'instruction. Ainsi, dans le déclencheur, vous avez accès aux valeurs OLD et NEW pour chaque colonne de la ligne donnée, mais vous n'avez pas accès à l'instruction qui a déclenché le déclencheur.

En ce qui concerne information_schema.processlist, rien n'est réellement "stocké" (persistant) dans cette vue. Il s'agit simplement d'une interface SQL vers la liste de processus, et l'instruction qui a provoqué le déclenchement du déclencheur n'est pas accessible dans la portée du déclencheur.

Vous avez dit que vous ne vouliez pas activer le journal des requêtes général, et cette approche n'est pas parfaite pour plusieurs raisons (y compris la granularité de event_Time étant de 1 seconde), mais voici un exemple de la façon dont vous pouvez réécrire votre déclencheur en utilisant le table 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 ;