当向数据库中的一个表添加新行时,MySQL 数据库是否可以调用外部 exe 文件?
我需要监视数据库中的更改,因此当进行相关更改时,我需要在数据库之外执行一些批处理作业。
查德·伯奇(Chad Birch)有一个好主意,使用MySQL 触发器和用户定义函数 http://dev.mysql.com/doc/refman/6.0/en/faqs-triggers.html#qandaitem-23-5-1-10。您可以在以下位置了解更多信息MySQL CREATE TRIGGER 语法 http://dev.mysql.com/doc/refman/6.0/en/create-trigger.html参考。
但是您确定插入行后需要立即调用可执行文件吗?看起来该方法很容易失败,因为 MySQL 可能会同时生成可执行文件的多个实例。如果您的可执行文件失败,则不会记录哪些行已处理、哪些行尚未处理。如果 MySQL 正在等待可执行文件完成,则插入行可能会非常慢。另外,如果 Chad Birch 是对的,那么就必须重新编译 MySQL,所以这听起来很困难。
我不会直接从 MySQL 调用可执行文件,而是使用触发器来简单地记录行被插入或更新的事实:在数据库中记录该信息,可以使用现有表中的新列,也可以使用名为 say 的全新表database_changes
。然后创建一个外部程序,定期从数据库中读取信息,对其进行处理,并将其标记为已完成。
您的具体解决方案将取决于外部程序实际需要的参数。
如果您的外部程序需要知道插入了哪一行,那么您的解决方案可能是这样的:创建一个名为database_changes
有字段date
, table_name
, and row_id
,对于所有其他表,创建如下触发器:
CREATE TRIGGER `my_trigger`
AFTER INSERT ON `table_name`
FOR EACH ROW BEGIN
INSERT INTO `database_changes` (`date`, `table_name`, `row_id`)
VALUES (NOW(), "table_name", NEW.id)
END;
然后你的批处理脚本可以执行如下操作:
- 选择database_changes 表中的第一行。
- 处理它。
- 去掉它。
- 重复1-3直到
database_changes
是空的。
通过这种方法,您可以更好地控制数据处理的时间和方式,并且您可以轻松检查数据是否实际得到处理(只需检查是否已处理)database_changes
表是空的)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)