sql >> Database >  >> RDS >> Mysql

MySQL-trigger krijgt de huidige query die ervoor zorgde dat de trigger werd geactiveerd

Het probleem hier is dat het bereik van MySQL-triggers op rijniveau is, niet op instructieniveau. Als zodanig heb je binnen de trigger toegang tot de OUDE en NIEUWE waarden voor elke kolom in de gegeven rij, maar heb je geen toegang tot de instructie die ervoor zorgde dat de trigger werd geactiveerd.

Met betrekking tot information_schema.processlist wordt in die weergave eigenlijk niets "opgeslagen" (aangehouden). Het is gewoon een SQL-interface naar de proceslijst en de instructie die ervoor zorgde dat de trigger werd geactiveerd, is niet toegankelijk binnen het bereik van de trigger.

U zei dat u het algemene querylogboek niet wilt inschakelen, en deze aanpak is om meerdere redenen niet perfect (inclusief de granulariteit van event_Time van 1 seconde), maar hier is een voorbeeld van hoe u uw trigger opnieuw zou kunnen schrijven met behulp van de 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. Gebruikersnaam weergeven op indexpagina

  2. SQL Server 2008-ondersteuning wordt beëindigd. Wat nu?

  3. MySQL-query om key:value toe te voegen aan JSON-tekenreeks

  4. SQL-query zoals GROUP BY met OR-voorwaarde