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

MySQL Trigger får den aktuelle forespørgsel, der fik triggeren til at udløse

Problemet her er, at omfanget af MySQL-triggere er på rækkeniveau, ikke erklæringsniveau. Som sådan har du inden for triggeren adgang til GAMLE og NYE værdier for hver kolonne i den givne række, men du har ikke adgang til den sætning, der fik triggeren til at udløses.

Med hensyn til information_schema.processlist er intet faktisk "gemt" (vedvarende) i den visning. Det er kun en SQL-grænseflade til proceslisten, og sætningen, der fik triggeren til at udløses, er ikke tilgængelig inden for udløserens omfang.

Du sagde, at du ikke ønsker at aktivere den generelle forespørgselslog, og denne tilgang er ikke perfekt af flere årsager (inklusive granulariteten af ​​event_Time er 1 sekund), men her er et eksempel på, hvordan du kan omskrive din trigger ved hjælp af general_log tabel:

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 ;


  1. Den berygtede java.sql.SQLEundtagelse:Ingen passende driver fundet

  2. SQLite DATEADD() Tilsvarende

  3. HQL / JPA finde tilgængelige varer mellem datointerval

  4. DATENAME() Eksempler i SQL Server