2011-04-24 63 views

回答

1

不可能使用标准的SQL功能。

+2

真正NOTIFY,虽然OP有这个特别标记“MySQL的”而不是“SQL” – Seaux 2013-07-23 15:25:02

6

这是理论上的可能,但我不会推荐它:

基本上你有一个触发器在表中的呼叫UDF它以某种方式与您的Python应用程序进行通信。

陷阱包括如果出现错误会发生什么?

如果它阻止?理想情况下,触发器内发生的任何事情都应该是近乎即时的。

如果它在回滚的事务中呢?

我确定还有很多其他问题,我没有想到。

如果可能,更好的方法是让您的数据访问层通知应用程序的其余部分。如果你正在寻找一个你的控制之外的程序修改了数据库,那么你可能会运气不好。

另一种不太理想的方式,比从触发器中调用另一个程序更好的方法是设置某种“LastModified”表,该触发器通过触发器进行更新。然后在您的应用程序中检查日期时间是否大于上次检查时的日期时间。

4

如果更改了您的意思,如果某行已更新,删除或插入,则有解决方法。

你可以在MySQL

DELIMITER $$ 

CREATE TRIGGER ai_tablename_each AFTER INSERT ON tablename FOR EACH ROW 
BEGIN 
    DECLARE exec_result integer; 

    SET exec_result = sys_exec(CONCAT('my_cmd ' 
            ,'insert on table tablename ' 
            ,',id=',new.id)); 
    IF exec_result = 0 THEN BEGIN 
    INSERT INTO table_external_result (id, tablename, result) 
     VALUES (null, 'tablename', 0) 
    END; END IF; 
END$$ 

DELIMITER ; 

创建触发器,这将调用可执行脚本my_cmd在服务器上。 (请参阅sys_exec返回更多信息)与一些参数。

my_cmd可以是一个Python程序或任何可以使用MySQL使用的用户帐户从命令行执行的任何东西。

您必须为每个变更(INSERT/UPDATE/DELETE)创建一个触发器,以便您希望程序得到通知,并为每个表格创建触发器。
此外,您还需要找到某种方法将运行的Python程序链接到您通过sys_exec()调用的命令行util。

不推荐
这种行为是不推荐,因为它很可能是:

  1. 慢下来的MySQL;
  2. 如果my_cmd没有返回,就会挂起/超时;
  3. 如果您正在使用交易,您会在之前通知交易结束;
  4. 我不确定如果交易回滚,您是否会收到delete的通知;
  5. 这是一个丑陋的设计

链接
sys_exec:http://www.mysqludf.org/lib_mysqludf_sys/index.php

0

它可能不是一个坏主意,尝试使用网络监视器,而不是一个MySQL触发器。扩展网络监视器这样的:

http://sourceforge.net/projects/pynetmontool/

然后编写的活动等待在端口3306(或任何与你的MySQL服务器侦听),然后脚本检查数据库在网络活动符合一定过滤条件。

这是,你必须要进一步研究的非常高的水平的想法,但你没有碰到DB触发的问题,你会不会写在每周二cron作业。

相关问题