Est-ce qu'un déclencheur accéder à la chaîne de requête?
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"
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