Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wyzwalacz MySQL pobiera aktualne zapytanie, które spowodowało uruchomienie wyzwalacza

Problem polega na tym, że zakres wyzwalaczy MySQL jest na poziomie wiersza, a nie na poziomie instrukcji. W związku z tym w wyzwalaczu masz dostęp do wartości STARY i NOWY dla każdej kolumny w danym wierszu, ale nie masz dostępu do instrukcji, która spowodowała uruchomienie wyzwalacza.

W odniesieniu do information_schema.processlist, nic nie jest w rzeczywistości "przechowywane" (utrwalane) w tym widoku. To tylko interfejs SQL do listy procesów, a instrukcja, która spowodowała uruchomienie wyzwalacza, nie jest dostępna w zakresie wyzwalacza.

Powiedziałeś, że nie chcesz włączać ogólnego dziennika zapytań, a to podejście nie jest idealne z wielu powodów (w tym z dokładnością do 1 sekundy), ale oto przykład, jak można ponownie napisać wyzwalacz za pomocą tabela 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. zmienna php w nazwie wiersza MySQL

  2. Jak poprawnie zapisać dane do bazy danych?

  3. Jak mogę sprawdzić, czy MySQL i Tomcat są uruchomione?

  4. Instrukcja wstawiania PDO z pętlą przez tablicę $_POST

  5. Jak korzystać z wielu baz danych dla jednej aplikacji rails 3.1 w Heroku?