2016-08-24 77 views
0

我在其中一个DB2表上触发了一个触发器。我需要的是,每次触发器运行时,都应该调用Linux shell脚本。如何为Linux shell脚本编写DB2函数

如何做到这一点 - 与其他进程一样?如果我的触发器是调用Java进程而不是shell脚本,那么将该进程的字节码(.class文件)放到..SQLLIB /函数中并为其定义一个函数就可以完成这项工作。

这对Linux脚本有什么不同,有什么微妙之处? 我几天没有Linux了,但部署在即将到来的地方,而且紧张不已。

TIA。

回答

1

有一篇关于 的文章Making Operating System Calls from SQL 其中包含示例代码。

+0

我会看看我刚才制作的那个是否运行。 thx为有用的来源。你以前在Linux Redhat上做过这样的事情吗? DB2是10.5。 – user6401178

+0

不使用Java,而是在数据插入表时使用它来调用ETL过程 - 是 – MichaelTiefenbacher

+0

您有没有得到位置..SQLLIB /函数?那是我为它破坏的一个。如果资源不必位于该目录中,那么很多事情对我来说会更容易 – user6401178

2

您无法从SQL调用shell脚本,包括触发器。您可以按照您所描述的方式创建Java UDF,然后使用Runtime.exec()来调用脚本。

请注意,除了引入安全风险之外,您的方法可能会影响数据一致性(事务可以回退,但不能“解除”脚本)和并发性(具有所有获取的锁的事务必须等待直到你的脚本返回)。

更好的方法是使用异步过程将外部操作与数据库事务分离。例如,您的触发器可能会将记录插入日志表中,外部进程将按计划读取该日志表,在找到新记录时执行所需的操作,然后删除处理的记录。

+0

合作的标志。我无法强调我会避免让数据库开始分派外部进程。运行一个守护进程以轮询事件或使用消息队列解决方案更好。 DB2包括可以直接写入Websphere MQ的函数(或者现在称为的任何函数)。 –