问题:我有一个存储某些记录的表格。在完成插入后,我想通过MySQL的sys_* UDFs调用外部程序(php脚本)。
现在的问题是,我编写的触发器将记录的ID传递给脚本。但是,当我尝试通过脚本提取数据时,我得到了0行。
在我的测试中,我得出了这样的结论:触发器在实际插入之前调用php脚本并传递参数,因此我无法获得给定ID的记录。
我已经在Ubuntu操作系统上测试了MySQL 5.0.75和5.1.41。
我可以确认参数在实际插入之前被传递到脚本中,因为我在我的php脚本中添加了sleep(2);,然后正确获取到了数据。如果没有sleep()语句,我会收到给定ID的0条记录。
我的问题是-如何解决这个问题,而不必在php脚本中硬编码一些延迟? 我不能假设2秒钟(或10秒钟)的延迟足够,所以我希望一切都能“自然”流动,即一个命令完成后,另一个被执行。
我认为,如果触发器是AFTER INSERT类型,那么触发器主体内的所有内容都将在MySQL实际插入数据后执行。
表格布局:
我的问题是-如何解决这个问题,而不必在php脚本中硬编码一些延迟? 我不能假设2秒钟(或10秒钟)的延迟足够,所以我希望一切都能“自然”流动,即一个命令完成后,另一个被执行。
我认为,如果触发器是AFTER INSERT类型,那么触发器主体内的所有内容都将在MySQL实际插入数据后执行。
表格布局:
CREATE TABLE test (
id int not null auto_increment PRIMARY KEY,
random_data varchar(255) not null
);
触发布局:
DELIMITER $$
CREATE TRIGGER `test_after_insert` AFTER INSERT ON `test`
FOR EACH ROW BEGIN
SET @exec_var = sys_exec(CONCAT('php /var/www/xyz/servers/dispatcher.php ', NEW.id));
END;
$$
DELIMITER ;
免责声明:我知道使用sys_exec函数存在安全问题,但我的问题是MySQL不会先插入数据,然后再调用带有必要参数的脚本。如果有人能够说明如何解决这个问题,或者有一种不涉及SELECT INTO OUTFILE和使用FAM的不同方法,我将非常感激。提前致谢。
mysql> SELECT sys_exec('php /var/www/xyz/servers/dispatcher.php 100');
如果无法正常工作,请确保mysql用户具有'rwx'权限。如果没有,请查看dispatcher.php文件的chmod
或chown
。 - Ivan Carrasco Quiroz