0

我有一个带有很多表的 Oracle DB ...我如何编写一些监听 Oracle DB 的东西,如果对 DB 进行了任何更改,它会调用另一个程序来进行一些处理

  1. 这将是异步的
  2. 如果发生任何类型的 DML,我只需要触发一个 java 程序.. 我不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这样做
4

3 回答 3

0

我担心你在这里为失败做好准备。我建议采取相关但略有不同的行动方案。

与其在每次数据更改时触发您的处理,不如考虑让您的处理每 X 分钟/小时/无论使用CronQuartz之类的东西运行一次。

如果您担心在未进行任何更改时让它运行,您可以向表中添加触发器以更新“上次更新”表,如果自上次运行以来未进行任何更改,您可以中止。

这避免了您对“on-update-processor”的最大担忧,即如果有一个 update会触发一个进程,并且在该进程运行时会发生另一个更新,您会怎么做。你会触发另一个进程吗?如果它们发生冲突怎么办?我认为您会发现在更新和同步过程之间稍有延迟会更好。

于 2013-07-19T21:04:06.610 回答
0

http://docs.oracle.com/cd/B14117_01/win.101/b10118/o4o00118.htm OracleDB 有一些事件。尝试使用它们;例如,当 db 更新时 - 并调用另一个 java 程序: Runtime.getRuntime().exec(/这里的参数/);

于 2013-07-19T21:01:48.003 回答
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 高级队列或其他一些队列机制。

于 2013-07-19T21:14:33.887 回答