mysql - 在插入或更新时获取完整的 MySQL 查询字符串

标签 mysql logging triggers

在 MySQL 方面需要帮助,因为它不是我的专长。因此,我们将不胜感激。

我的网站上存在问题,其中 UPDATEINSERT 使用缺失值完成。这导致网站上的其他功能出现一些问题,但我无法在任何类中找到 UPDATEINSERT 的位置。

有什么方法,可能是 MySQL 触发器,我可以添加到这些表中,以便我存储 UPDATEINSERT 的原始或完整查询.我尝试过日志记录,但这适用于整个数据库,并且占用了太多磁盘空间。

提前感谢您的任何回复。

PS:目前,PHP 类有点乱,因为我们还处于开发阶段,所以在更新或插入函数中添加异常会花费太多时间。所以请重点回答问题。再次感谢。

最佳答案

您可以使用以下语句将当前 SQL 查询作为字符串获取:

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

所以你要做的是创建一个TRIGGER,它在你的表上运行插入和/或更新操作,应该(i)获取当前的sql语句并 (ii) 将其插入到另一个表中,如下所示:

DELIMITER |

CREATE TRIGGER log_queries_insert BEFORE INSERT ON `your_table`
FOR EACH ROW
BEGIN
    DECLARE original_query VARCHAR(1024);
    SET original_query = (SELECT info FROM INFORMATION_SCHEMA.PROCESSLIST WHERE id = CONNECTION_ID());
    INSERT INTO `app_sql_debug_log`(`query`) VALUES (original_query);
END;
|
DELIMITER ;

您必须创建两个触发器 - 一个用于更新,一个用于插入。触发器将新查询作为字符串插入到 query 列的 app_sql_debug_log 表中。

关于mysql - 在插入或更新时获取完整的 MySQL 查询字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10628640/

相关文章:

mysql - 如何合并 Google Cloud SQL 上的数据库?

multithreading - 写入单个日志文件的多线程中的Powershell代码,但是由于文件正在使用中而丢失了一些数据

java - 从两个不同的类登录 xml 的正确方法是什么?现在我在生成的 xml 中遇到错误

java - Log4j2 + Java:以编程方式添加asyncLogger

mysql - 如何使用 JSF 和 PrimeFaces 将上传的文件作为 Blob 存储在 mysql 数据库中

mysql - SQLSTATE[HY000] : General error: 1366 Incorrect integer value:

java - 使用 MySQL 5.1 配置 Hibernate 4 时遇到问题

MySQL死锁问题

mysql - 查找行并将其插入到另一个表mysql触发器

MySQL-在插入替换日期之前创建触发器