【发布时间】:2011-11-30 21:27:45
【问题描述】:
也许是一个奇怪的标题,我会试着解释一下。 我有两台 Oracle 服务器 serverA 和 serverB。
- 在 serverA 上,我有一个表 tabA,其中每分钟有一行 插入。
- 在 serverB 上,我创建了一个表 tabB,它具有相同的 结构为tabA。
- 在服务器 A 上,我创建了一个到服务器 B 的 dblink。在 serverA 我创建了一个插入触发器,例如
在 A
create trigger tabA_trig
after insert on tabA
begin
insert into tabB@serverB(...) values(:new....,:new... etc);
exception
when others then null;
end tabA_trig;
在创建此触发器后,每次将新行插入 tabA 时,都会向 tabB 插入新行,正如预期的那样。
但是:当 serverA 和 serverB 之间的通信中断时,我没有收到任何错误(上面的异常会解决这个问题),但是也没有数据插入到 tabA 中!很奇怪,更奇怪的是,大约 15 分钟后,新数据又被插入到 tabA 中。过了一会儿,缺失的数据开始填补这个洞,过了一会儿,没有数据丢失,插入功能正常。
示例(tabA 和 tabB,第一列时间分钟和小时,第二列值):
Network OK:
tabA 1000 22;1001 22;1002 22
tabB 1000 22;1001 22;1002 22
Network ERROR:
About 15 minutes of no new data.
After 15 minutes:
tabA 1000 22;1001 22;1002 22;1017 22;1018 22;....
tabB 1000 22;1001 22;1002 22
After 30 minutes:
tabA 1000 22;1001 22;1002 22;1003 22;1004 22;1005 22;1006 22;1017 22;1018 22;....
tabB 1000 22;1001 22;1002 22
After 1 hour:
tabA 1000 22;1001 22;1002 22;1003 22;1004 22;1005 22;1006 22;1006 22;...;1017 22;1018 22;....
tabB 1000 22;1001 22;1002 22
如果我禁用触发器,tabA 上的插入会立即生效。
我使用触发器而不是物化视图的原因是,即使从 tabA 中删除数据,我也希望保留已复制到 tabB 的所有数据。
有人知道该怎么办吗?
【问题讨论】:
标签: oracle