2011-05-22 169 views
5

我的要求是: 當一個新條目添加到一個表時運行一個shell腳本。我們可以從sqlite3執行操作系統命令嗎

有什麼辦法可以在插入新行時添加觸發器來運行shell腳本?


好了,情況是:

我使用的是不同的程序的數據庫。 說程序X創建並填充xyz.db,只要程序X向表中插入新行,我就需要執行一個小腳本。

目前我的shell腳本在循環中無限運行並檢查是否有新行並處理它,因爲插入不是很頻繁,所以不斷運行腳本不是一個好的選擇。

我的問題是類似can we execute unix command from oracle10g procedure,但我需要做相同的sqlite3的

+1

如果這確實是一項要求,那麼您的體系結構已損壞並需要修復。在SQL的正常範圍內混合邏輯和持久性(觸發器,存儲過程等)已經夠糟糕的了,但是這個? *不寒而慄* – 2011-05-22 14:19:02

+1

爲什麼你不能用你用來控制sqlite的任何編程語言來做到這一點?例如。如果插入成功,請使用Python或任何運行腳本。 – 2011-05-22 14:29:46

+0

查看下面更新的答案 – zode64 2011-05-22 15:33:57

回答

3

首先,我與意見完全一致,這聽起來像一個可憐的架構。如果shell腳本操作不獨立於與數據庫交互的程序,則應該通過調用某種系統命令,在程序使用的驅動程序中或作爲主代碼的一部分,將此調用嵌入到代碼中。

在Java中,可以使用ProcessBuilder類,system(<command>)方法在ruby和os.system(<command>) python中完成。

在oracle中,可以在java中編寫觸發器,您可以使用它來進行系統調用,但是sqlite中不存在此功能。

如果完全有必要,我會建議在你的sqlite數據庫驅動程序中編寫一個包裝器,並在那裏進行系統調用。

也許你可以擴大你真正需要做的,我們可以給替代方法

更新:

您可以創建在C/C++使用C/C++源碼界面回調函數(見數據變化http://www.sqlite.org/capi3ref.html通知回調),你可以在你的觸發

CREATE TRIGGER <trigger name> 
    INSERT ON <table_name> 
    BEGIN 
     SELECT callback_function() 
    END; 

致電然後,您可以使用此CALLBACK_FUNCTION調用你的shell腳本,聽起來比較複雜,但很有趣。

1

我只是想知道你是問正確的問題...

至於你說

檢查,如果有任何新行並對其進行處理,...(罕見) ...連續運行腳本不是一個好的選擇。

,所以你現在有類似

while true ; do 
    $scriptPath/sqlCheckForNewValues.sh 
    sleep ${sleepSecs:-60} 
done 

(如果你沒有一覺,然後同意了,這不是最佳的,並且注意,睡眠值可以在辦理入住手續的時間進行調整,以超出用戶的期望(所以也許300秒就足夠了。

雖然我在這個架構中主要的反對同意,只有你知道真正的優先級(都到需要對你想怎麼完成更多的背景資料)。

從你所描述的東西,你我們將花費大量的時間來解決這個問題並編寫解決方案,因爲它可能不會佔用整個系統處理時間的0.001%以上。

這是一件不錯的事,或者你真的可以量化這是值得花時間的開支嗎?你有沒有其他的功能,這一次會更好地花在?

IHTH

+0

我很感激評論爲什麼這是倒票。謝謝。 – shellter 2011-05-22 19:28:50

相關問題