Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Trigger erhält die aktuelle Abfrage, die zum Auslösen des Triggers geführt hat

Das Problem dabei ist, dass der Gültigkeitsbereich von MySQL-Triggern auf Zeilenebene und nicht auf Anweisungsebene liegt. Als solches haben Sie innerhalb des Triggers Zugriff auf die OLD- und NEW-Werte für jede Spalte in der angegebenen Zeile, aber Sie haben keinen Zugriff auf die Anweisung, die das Auslösen des Triggers verursacht hat.

In Bezug auf information_schema.processlist wird in dieser Ansicht tatsächlich nichts "gespeichert" (persistent). Es ist nur eine SQL-Schnittstelle zur Prozessliste, und auf die Anweisung, die das Auslösen des Triggers verursacht hat, kann im Bereich des Triggers nicht zugegriffen werden.

Sie sagten, Sie möchten das allgemeine Abfrageprotokoll nicht aktivieren, und dieser Ansatz ist aus mehreren Gründen nicht perfekt (einschließlich der Granularität von event_Time von 1 Sekunde), aber hier ist ein Beispiel dafür, wie Sie Ihren Trigger mithilfe von neu schreiben könnten general_log-Tabelle:

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 ;