有什么办法来添加一个触发器来插入新行上运行的shell脚本?
那么情况是这样的:
我正在使用不同程序的数据库。 说程序X创build并填充xyz.db,只要程序X向表中插入新行,我就需要执行一个小脚本。
尝试mkdir时Shellvariables问题
Bash,是隐式引用的子shell输出
如何在Python中运行bash脚本,但是如果从另一个目录运行它?
GNU / Linux中两个文件(如行集)的笛卡尔积
这里是文件:没有参数扩展
目前我的shell脚本无限循环运行,并检查是否有新行并处理它,因为插入不是很频繁,所以连续运行脚本不是一个好的select。
我的问题是类似的, 我们可以从oracle10g程序执行unix命令,但我需要在sqlite3中做同样的事情
dynamic构buildgrepstring
在Unix中向数字string添加逗号
freeTDS bash:在Microsoft sql Server中执行SQL查询
Will()构造总是启动一个子shell?
首先,我完全同意评论,这听起来像是一个糟糕的架构。 如果shell脚本操作不独立于与数据库交互的程序,则应该通过调用某些系统命令,程序使用的驱动程序或作为主代码的一部分,将此调用嵌入到代码中。
在Java中,可以使用Ruby中的ProcessBuilder类, system(<command>)方法和os.system(<command>)来完成。
在oracle中,可以在java中编写触发器,您可以使用它来进行系统调用,但在sqlite中不存在此功能。
如果这是完全必要的,我会建议编写一个包装你的sqlite数据库驱动程序,并在那里进行系统调用。
更新:
您可以使用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脚本,听起来相对复杂,但是很有趣。
我只是想确定你问的是正确的问题
正如你所说
检查是否有新的行,并处理它,…(罕见)…连续运行脚本不是一个好的选择。
所以你现在有类似的东西
while true ; do $scriptPath/sqlCheckForNewValues.sh sleep ${sleepSecs:-60} done
?
(如果你没有睡眠,那么就同意了,这不是最优的,并且注意睡眠值可以根据检查时间进行调整,以超出用户的期望(所以也许300秒就足够了)。
虽然我同意这个架构的反对意见,但只有你知道真正的优先事项(这需要更多的背景信息)。
从你所描述的,你将花费大量的时间来解决这个问题,并且可能不会占用整个系统处理时间的0.001%。
这是一件好事吗?或者你真的可以量化这是值得花费的时间吗? 你有没有其他的功能,这一次会更好地花在?
IHTH