2011-04-24 126 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作業。

相關問題