Может ли триггер получить доступ к строке запроса?

dba.stackexchange https://dba.stackexchange.com/questions/8108

  •  16-10-2019
  •  | 
  •  

Вопрос

Я думаю об использовании триггеров в качестве механизма ведения журнала в 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top