触发器可以访问查询字符串吗?

Bea*_*eat 5 mysql trigger

我正在考虑在 MySQL (v. 5.1) 中使用触发器作为日志记录机制,因此我希望触发器获取查询字符串以便将其存储在另一个表中。

我在 MySQL 文档中找不到类似的东西,所以我希望答案是否定的——但我仍然希望我忽略了一些东西。

PS:这个问题与IcarusNM 对我的问题“记录 MySQL 数据库更改查询和用户”的回答有关

Rol*_*DBA 5

我有一个可行的理论(拉福吉会对皮卡德上尉说)。..

由于您使用的是 MySQL 5.1,因此您可以访问表INFORMATION_SCHEMA.PROCESSLIST

您还可以访问触发器正在运行的当前进程的 ID。获取该进程 ID 的函数是CONNECTION_ID

您可以尝试像这样找出查询:

SELECT info FROM INFORMATION_SCHEMA.PROCESSLIST WHERE id = CONNECTION_ID();
Run Code Online (Sandbox Code Playgroud)

请记住,它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)
Run Code Online (Sandbox Code Playgroud)

在触发器中,您可以使用局部变量来保存查询

DECLARE original_query VARCHAR(1024);
Run Code Online (Sandbox Code Playgroud)

然后捕获查询

SELECT info INTO original_query FROM INFORMATION_SCHEMA.PROCESSLIST WHERE id = CONNECTION_ID();
Run Code Online (Sandbox Code Playgroud)

试一试 !!!

如果有效的话

就这样吧(皮卡德上尉会讽刺拉福吉)