添加数据库中的新行时,必须调用外部命令行程序

时间:2009-03-21 03:12:37

标签: mysql database-design

当新数据库添加到数据库中的某个表时,MySQL数据库是否可以调用外部exe文件?

我需要监控数据库中的更改,因此在进行相关更改时,我需要在数据库外执行一些批处理作业。

4 个答案:

答案 0 :(得分:14)

Chad Birch使用MySQL triggers and a user-defined function时有个好主意。您可以在MySQL CREATE TRIGGER Syntax参考中找到更多信息。

但是你确定在插入行时需要立即调用可执行文件吗?看起来这种方法很容易失败,因为MySQL可能会同时产生多个可执行文件的实例。如果您的可执行文件失败,那么将不会记录哪些行尚未处理,哪些行尚未处理。如果MySQL正在等待您的可执行文件完成,那么插入行可能会非常慢。此外,如果Chad Birch是正确的,那么将不得不重新编译MySQL,所以听起来很难。

我不会直接从MySQL调用可执行文件,而是使用触发器来简单记录行被INSERTED或UPDATED的事实:在数据库中记录该信息,或者使用现有表中的新列或使用全新的表叫做database_changes。然后创建一个外部程序,定期从数据库中读取信息,处理它,并将其标记为已完成。

您的具体解决方案将取决于外部程序实际需要的参数。

如果您的外部程序需要知道插入了哪一行,那么您的解决方案可能是这样的:创建一个名为database_changes的新表,其中包含字段datetable_name和{{ 1}},对于所有其他表,制作一个这样的触发器:

row_id

然后您的批处理脚本可以执行以下操作:

  1. 选择database_changes表中的第一行。
  2. 处理它。
  3. 将其删除。
  4. 重复1-3,直到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; 为空。
  5. 通过这种方法,您可以更好地控制数据处理的时间和方式,并且可以轻松检查数据是否实际得到处理(只需检查database_changes表是否为空)

答案 1 :(得分:4)

  1. 你可以做复制做的事情:挂在'二进制日志'上。将服务器设置为“主服务器”,而不是添加“从服务器”,运行mysqlbinlog。您将获得修改数据库的每个命令的流。

    • 介入客户端和服务器之间:检查MySQLProxy。您将其指向您的服务器,并将您的客户端指向代理。它允许您插入Lua脚本来监视,分析或转换任何SQL命令。

答案 2 :(得分:0)

我认为这需要添加一个用户定义的函数,我相信这需要重新编译:

MySQL FAQ - Triggers: Can triggers call an external application through a UDF?

答案 3 :(得分:0)

我认为对表进行一些外部流程轮询更改并执行外部程序真的是一个更好的主意 - 您还可以拥有一个包含此外部程序运行状态的列(例如“挂起”,“失败” “,”“成功”) - 只选择该列“待定”的行。

这取决于批处理作业需要多快运行。如果它需要“迟早”运行并且可能失败并需要重试,那么肯定有一个应用程序轮询表并根据需要运行它们。