Может ли триггер получить доступ к строке запроса?
Вопрос
Я думаю об использовании триггеров в качестве механизма ведения журнала в MySQL (ст. 5.1), и поэтому я бы хотел, чтобы мой триггер получил строку запроса, чтобы хранить ее в другой табе.
Я не мог найти ничего подобного в документации MySQL, поэтому я ожидаю, что ответ не будет - но я все еще надеюсь, что я что -то упустил.
PS: этот вопрос связан с Ответ iCarusNM на мой вопрос "журнал MySQL DB Изменение запросов и пользователей"
Решение
У меня есть рабочая теория (Лафордж сказал бы капитану Пикарду)...
Поскольку вы используете MySQL 5.1, у вас есть доступ к таблице Information_schema.processlist.
У вас также есть доступ к идентификатору текущего процесса, на котором работает триггер. Функция получения этого идентификатора процесса - это Connection_id.
Вы можете попытаться выловить запрос таким образом:
SELECT info FROM INFORMATION_SCHEMA.PROCESSLIST WHERE id = CONNECTION_ID();
Имейте в виду, что 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)
Внутри триггера вы можете использовать локальную переменную для удержания запроса
DECLARE original_query VARCHAR(1024);
а затем запечатлеть запрос
SELECT info INTO original_query FROM INFORMATION_SCHEMA.PROCESSLIST WHERE id = CONNECTION_ID();
Попробуй !!!
Если это работает, то
Сделайте это (капитан Пикард вернется в Лафордж)
Другие советы
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