如果没有重复,则在插入后检查MySQL触发器,然后运行sys_exec udf

时间:2017-09-25 04:59:55

标签: mysql database-trigger

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条件。

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

1 个答案:

答案 0 :(得分:1)

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

原因:

  • 当触发器运行时(甚至是触发后),插件尚未在数据库中提交。如果您的PHP脚本尝试查询数据库,它将无法看到未提交的数据。此外,插件可能会回滚,但电话无法回滚。
  • 您无法检查PHP脚本中的错误或退出状态。调试PHP脚本是否成功很难。

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