MySQL 触发器在插入后检查是不是没有重复然后运行 ​​sys_exec udf

Posted

技术标签:

【中文标题】MySQL 触发器在插入后检查是不是没有重复然后运行 ​​sys_exec udf【英文标题】:MySQL trigger to check after insert if no duplicate then run sys_exec udfMySQL 触发器在插入后检查是否没有重复然后运行 ​​sys_exec udf 【发布时间】:2017-09-25 04:59:54 【问题描述】:

mysql 版本:5.1.73 数据库客户端版本:libmysql - 5.1.73

我正在尝试检查最近一小时内 NEW.src 是否存在,如果不存在则执行 sys_exec udf。

我在mysql中有以下触发器。由于这是插入后触发器,我的 IF 条件将检查过去一小时内是否只有一个值,然后继续执行 sys_exec 语句。

BEGIN
SET @numofcalls = (SELECT count(src) FROM `cdr` WHERE calldate >= DATE_SUB(NOW(),INTERVAL 1 HOUR) AND src = NEW.src);
IF (numofcalls = 1) then
SET @missed_call = sys_exec(CONCAT('/usr/bin/php /var/lib/asterisk/agi-bin/api_pbx/call_api.php ', NEW.src));
END IF;
END

保存触发器时没有语法错误。当插入新记录时,sys_exec 语句似乎没有运行并退出 IF 条件。

有人可以建议我在这里做错了什么。

【问题讨论】:

如果在最后一小时没有 NEW.src 的重复项,那么您正在运行 sys_exec udf。所以你的 if 条件应该是 numofcalls = 0 而不是 numofcalls = 1。你还需要使用下面的查询 SELECT name FROM mysql.proc WHERE name = 'my_name' 来检查你的 udf 是否存在。 第一件事,因为这是插入后触发器,数据应该已经存在。因此 if 条件值为 1。其次,udf 在没有 if 条件或 select 查询的情况下工作,直接使用 after insert 触发器运行。 如果条件是 IF (numofcalls = 1) 那么。我认为应该是 IF (@numofcalls = 1)。其他然后这个我认为你的代码是好的。 【参考方案1】:

我建议您不要从 MySQL 触发器执行 php 程序。

原因:

当触发器运行时(即使是后触发器),插入还没有提交到数据库中。如果您的 PHP 脚本尝试查询数据库,它将无法看到未提交的数据。此外,插入可以回滚,但电话不能回滚。 您无法从 PHP 脚本检查错误或退出状态。 PHP脚本是否成功,很难调试。

相反,我建议您不要使用触发器,而是插入数据并提交事务,然后使用应用程序代码检查您是否应该运行调用,然后从您的应用程序中执行它。换句话说,不要执行在数据库之外有影响的代码。

【讨论】:

在整个流程中,我没有通过我的 php 脚本与 mysql 数据库进行任何事务。 总是在做一个事务,即使它是自动提交的。然而,如果您从触发器运行外部程序,并且该程序尝试查询其插入产生触发器的行,则该行将不可见。试试看。

以上是关于MySQL 触发器在插入后检查是不是没有重复然后运行 ​​sys_exec udf的主要内容,如果未能解决你的问题,请参考以下文章

Mysql触发器用于在插入前检查表中的重复记录

如何在插入 MySQL 之前检查表中是不是存在名称 [重复]

mysql数据库insert插入重复问题

MySQL 查询以检查某些短语(重复文章、抄袭)

插入后的MySQL触发器

如何编写mysql触发器