Domanda

Sto pensando di usare i trigger come un meccanismo di registrazione in MySQL (v. 5.1) e quindi mi piacerebbe il mio grilletto per ottenere la stringa di query al fine di conservarla in un'altra tabe.

non ho trovato niente di simile nella documentazione MySQL quindi mi aspetto la risposta a nessun essere -. Ma io continuo a sperare che ho trascurato qualcosa

PS: questa domanda è legata alla di IcarusNM risposta alla mia domanda "Log DB MySQL cambiare le query e gli utenti"

È stato utile?

Soluzione

Ho una teoria di lavoro (LaForge direbbe al capitano Picard). ..

Dal momento che si sta utilizzando MySQL 5.1, è possibile accedere alla tabella INFORMATION_SCHEMA.PROCESSLIST .

Hai anche accesso al ID del processo corrente il grilletto è in esecuzione. La funzione per ottenere che ID di processo è CONNECTION_ID .

Si potrebbe provare a ripescare la query in questo modo:

SELECT info FROM INFORMATION_SCHEMA.PROCESSLIST WHERE id = CONNECTION_ID();

Tieni presente che il info è LONGTEXT:

mysql> show create table information_schema.processlist\G
*************************** 1. row ***************************
       Table: PROCESSLIST
Create Table: CREATE TEMPORARY TABLE `PROCESSLIST` (
  `ID` bigint(4) NOT NULL DEFAULT '0',
  `USER` varchar(16) NOT NULL DEFAULT '',
  `HOST` varchar(64) NOT NULL DEFAULT '',
  `DB` varchar(64) DEFAULT NULL,
  `COMMAND` varchar(16) NOT NULL DEFAULT '',
  `TIME` int(7) NOT NULL DEFAULT '0',
  `STATE` varchar(64) DEFAULT NULL,
  `INFO` longtext
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

Entro il grilletto, è possibile utilizzare una variabile locale per contenere la query

DECLARE original_query VARCHAR(1024);

e quindi acquisire la query

SELECT info INTO original_query FROM INFORMATION_SCHEMA.PROCESSLIST WHERE id = CONNECTION_ID();

fare un tentativo !!!

Se funziona, allora

fare in modo (capitano Picard avrebbe quip torna a LaForge)

Altri suggerimenti

DROP TRIGGER IF EXISTS DEBUG_TIGGER;
CREATE TRIGGER DEBUG_TIGGER
AFTER UPDATE ON my_table 
FOR EACH ROW 
BEGIN
    INSERT INTO log_my_table(query)
    SELECT argument 
    FROM mysql.general_log 
    WHERE thread_id = connection_id()
    ORDER BY event_time DESC 
    LIMIT 5; /*gives last 5 queries(this will help you get idea of what logical path was taken)*/

    INSERT log_my_table
    (query)
    VALUES('-----------------');/*empty place holder*/
END
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top