sql >> Databáze >  >> RDS >> Mysql

MySQL Trigger získá aktuální dotaz, který způsobil spuštění triggeru

Problém je v tom, že rozsah spouštěčů MySQL je na úrovni řádků, nikoli na úrovni příkazů. V rámci pravidla tak máte přístup k hodnotám OLD a NEW pro každý sloupec v daném řádku, ale nemáte přístup k příkazu, který způsobil spuštění pravidla.

Pokud jde o information_schema.processlist, v tomto pohledu není ve skutečnosti nic „uloženo“ (přetrváváno). Je to pouze rozhraní SQL k seznamu procesů a příkaz, který způsobil spuštění spouštěče, není v rámci spouštěče přístupný.

Řekli jste, že nechcete povolit obecný protokol dotazů a tento přístup není dokonalý z několika důvodů (včetně granularity event_Time na 1 sekundu), ale zde je příklad toho, jak byste mohli přepsat spouštěč pomocí tabulka 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 ;


  1. Oracle ODBC:SQLAllocHandle ovladače na SQL_HANDLE_ENV se nezdařilo

  2. Odstraňte duplikáty z tabulky a znovu propojte odkazující řádky s novou předlohou

  3. Funkce MySQL Přidání cen z více tabulek

  4. Problémy s příkazy MySQL a Python Select