我有一个包含大量表的Oracle数据库...如何编写一些可以监听Oracle数据库的内容,如果对数据库进行了任何更改,它会调用另一个执行某些处理的程序
t want details about which table or what rows or new/old values ...
If there is a DML on any table in a DB call a java program that
它答案 0 :(得分:0)
http://docs.oracle.com/cd/B14117_01/win.101/b10118/o4o00118.htm OracleDB有一些事件。试着用它们;例如,当db更新时 - 并调用另一个java程序: Runtime.getRuntime()。exec(/ 这里的参数 /);
答案 1 :(得分:0)
我担心你在这里为失败做好准备。我建议采取相关但略有不同的行动方案。
不要在每次数据更改时触发处理,而是考虑使用Cron或Quartz等内容每隔X分钟/小时运行一次。
如果您担心在未进行任何更改时运行它,您可以向表中添加触发器以更新“上次更新”表,如果自上次运行后未进行任何更改,则可以中止。 / p>
这避免了您对“更新处理器”的最大担忧,即如果有更新,您会做什么(触发流程),以及正在运行另一次更新发生。你引发了另一个过程吗?怎么会发生冲突?我认为你会发现在更新和同步过程之间稍微延迟会更好。
答案 2 :(得分:0)
对于一个问题,这是一个非常高的命令。
对于初学者,您将需要一种方法来检测是否发生了DML操作(INSERT,UPDATE,DELETE)。
对于各个表的审核,我们可以使用TRIGGERS。
CREATE TRIGGER [BEFORE|AFTER] [INSERT][UPDATE][DELETE] ... [FOR EACH ROW]
规范性操作是在“审核日志”表中记录有关信息的信息(以后需要的任何内容)。您必须决定您需要执行的操作是否是同步的(应该在DML完成之前发生),或者这些操作是否可以是异步的(可以在DML完成后的任何时间发生)。
通常,同步处理在PL / SQL中完成,但Oracle确实提供了一种调用外部过程(EXTPROC)的机制,尽管您不希望从TRIGGER那样做。
Oracle还提供“细粒度审计”。 FGA收集的信息不是“逐行”级别,就像我们可以通过FOR EACH ROW触发器一样。
所以,这实际上取决于你想要达到的目标。
下一步是弄清楚如何将这些信息提供给外部流程。该进程是否会定期轮询表(或表集),您是要使用AQ高级队列还是其他一些队列机制。