Question

Je pense à l'aide de déclencheurs comme mécanisme de journalisation dans MySQL (v. 5.1) et donc je voudrais que mon déclencheur pour obtenir la chaîne de requête afin de le stocker dans un autre Tabe.

Je ne pouvais pas trouver quelque chose comme ça dans la documentation de MySQL, donc je pense que la réponse soit non -. Mais j'espère encore que je l'ai oublié quelque chose

PS: cette question est liée à la réponse IcarusNM à ma question "Log MySQL DB changer les requêtes et les utilisateurs"

Était-ce utile?

La solution

J'ai une théorie de travail (LaForge dirait au Capitaine Picard). ..

Puisque vous utilisez MySQL 5.1, vous avez accès à la table INFORMATION_SCHEMA.PROCESSLIST .

Vous avez également accès à l'ID du processus actuel le déclencheur est en cours d'exécution sur. La fonction pour obtenir cet ID de processus est CONNECTION_ID .

Vous pouvez essayer de pêcher la requête comme ceci:

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

Gardez à l'esprit que le info est 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)

Dans le trigger, vous pouvez utiliser une variable locale pour maintenir la requête

DECLARE original_query VARCHAR(1024);

puis saisir la requête

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

Lui donner un essai !!!

Si cela fonctionne, alors

Faites en sorte (le capitaine Picard serait quip retour à LaForge)

Autres conseils

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top