我的要求是: 在将新条目添加到表中时运行shell脚本。
有没有办法在插入新行时添加触发器来运行shell脚本?
嗯,情况是:
我正在使用不同程序的数据库。 假设程序X创建并填充xyz.db,我只需要在程序X将新行插入表中时执行一个小脚本。
目前我的shell脚本在循环中无限运行并检查是否有新行并对其进行处理,因为插入不是很频繁,连续运行脚本不是一个好选择。
我的问题类似于can we execute unix command from oracle10g procedure,但我需要在sqlite3
中做同样的事情答案 0 :(得分:4)
首先,我完全赞同这些评论,这听起来像是一个糟糕的架构。如果shell脚本操作不是独立于与数据库交互的程序,则应通过调用某种系统命令,在程序使用的驱动程序中或作为主代码的一部分,将此调用嵌入到代码中。
在Java中,可以使用ruby中的ProcessBuilder
类,system(<command>)
方法和python中的os.system(<command>)
来完成。
在oracle中,可以在java中编写可用于进行系统调用的触发器,但sqlite中不存在此功能。
如果完全有必要,我建议在sqlite db驱动程序周围编写一个包装器并在那里进行系统调用。
也许您可以扩展您实际需要做的事情,我们可以提供替代方法
更新
您可以使用c / c ++ sqlite界面在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 :(得分:1)
我只是想确定你问的是正确的问题......
正如你所说
检查是否有新行并处理它,...(不经常)...连续运行脚本不是一个好选择。
所以你现在有类似
的东西while true ; do
$scriptPath/sqlCheckForNewValues.sh
sleep ${sleepSecs:-60}
done
(如果你没有睡觉,那么同意,这不是最佳的,并且注意睡眠值可以在检查时间调整以超过用户期望(所以可能300秒就足够了。)
虽然我在校长中同意对这种架构的反对意见,但只有你知道真正的优先事项(这需要更多关于你想要完成的事情的背景信息)。
根据您的描述,当您的整个系统处理时间不超过.001%时,您将花费大量时间来计算和解决此问题的解决方案。
这是一件好事吗,或者你能真正量化这是否值得及时支出?难道你没有其他功能,这次会更好用吗?
IHTH