Pregunta

Estoy pensando en usar los desencadenantes como un mecanismo de registro en MySQL (v. 5.1) y, por lo tanto, me gustaría mi desencadenante para obtener la cadena de consulta para almacenarlo en otro tabe.

No pude encontrar algo así en la documentación de MySQL, así que espero que la respuesta sea no, pero todavía espero haber pasado por alto algo.

PD: Esta pregunta está relacionada con Respuesta de Icarusnm a mi pregunta "Registre las consultas y usuarios de cambio de cambio de DB MySQL DB"

¿Fue útil?

Solución

Tengo una teoría de trabajo (LaForge le diría al Capitán Picard)...

Dado que estás usando mysql 5.1, tienes acceso a la mesa Información_schema.processlist.

También tiene acceso a la ID del proceso actual en el que se está ejecutando. La función para obtener esa identificación del proceso es Connection_id.

Podrías intentar pescar la consulta como esta:

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

Tenga en cuenta que el info es 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)

Dentro del disparador, puede usar una variable local para mantener la consulta

DECLARE original_query VARCHAR(1024);

y luego captura la consulta

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

Darle una oportunidad !!!

Si funciona, entonces

Hazlo así (el Capitán Picard volvería a Laforge)

Otros consejos

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top