关于同一个库中两个表同步的问题

zhouzh_yutu 2012-02-01 02:55:09
假如有两个表A和B
A表和B表中字段不完全相同
现要求增删改A表的同时同步B表相同的字段
相反增删改B表的同时同步A表相同的字段
假设相同的字段是id
...全文
683 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ORAClE SE 2012-08-03
  • 打赏
  • 举报
回复
还没结贴!!!!
zhouzh_yutu 2012-02-02
  • 打赏
  • 举报
回复
create or replace trigger trg_del_crdt_enter
after delete on crdt_enterprise FOR EACH ROW
begin
delete from base_enterprise where wrybh=:old.wrybh;
end trg_del_crdt_enter;

create or replace trigger trg_del_base_enter
after delete on base_enterprise FOR EACH ROW
begin
delete from crdt_enterprise where wrybh=:old.wrybh;
end trg_del_base_enter;
前面新增和删除解决了 这个删除已运行就报错 怎么解决
xiaobluesky 2012-02-01
  • 打赏
  • 举报
回复

当两张表相互协调数据时,表1更新表2的数据,而表2又更新表1的数据,这样就会循环触发而报错.
解决办法,把表换成视图,在视图上建立触发器更新表
--创建表
CREATE TABLE TEST1 ( SID VARCHAR2(10), SNAME VARCHAR2(60) );

--创建表二
CREATE TABLE TEST2 ( SID VARCHAR2(10), SNAME VARCHAR2(60) );

-------------------------------------------------------------------
--基于表创建视图
CREATE OR REPLACE VIEW V_TEST1 AS SELECT * FROM TEST1;

CREATE OR REPLACE VIEW V_TEST2 AS SELECT * FROM TEST2;

-------------------------------------------------------------------
SELECT * FROM TEST1;
SELECT * FROM TEST2;

-------------------------------------------------------------------
UPDATE TEST1 SET SNAME = 'this is a good day!' WHERE SID = 'S0001';
UPDATE TEST2 SET SNAME = 'this is a bad day!' WHERE SID = 'S0001';
UPDATE V_TEST1 SET SNAME = 'this is a good day!' WHERE SID = 'S0001';
UPDATE V_TEST2 SET SNAME = 'this is a bad day!' WHERE SID = 'S0001';

-------------------------------------------------------------------
--创建触发器 CREATE OR REPLACE TRIGGER UPDATE_TEST2 INSTEAD OF UPDATE OR INSERT ON V_TEST1
--FOR EACH ROW DECLARE BEGIN UPDATE TEST2 SET SNAME = :NEW.SNAME WHERE SID = :OLD.SID; END;

--注意这里是 INSTEAD OF 而不是 after or befor
-------------------------------------------------------------------
CREATE OR REPLACE TRIGGER UPDATE_TEST1 INSTEAD OF UPDATE OR INSERT ON V_TEST2 FOR EACH ROW DECLARE BEGIN

UPDATE TEST1 SET SNAME = :NEW.SNAME WHERE SID = :OLD.SID; END;

mailking 2012-02-01
  • 打赏
  • 举报
回复
看你的应用需求可以考虑
把B表建成一个A表的视图,这样两边更新就可以都看得到了
  • 打赏
  • 举报
回复
建议贴出具体的表 和需求。。
  • 打赏
  • 举报
回复
假设你对表a的 字段id进行修改
触发触发器a对表b的 id2进行修改
此时又触发触发器b 这时候
你的触发器不应该再次修改表a的id
不然又会触发触发器a
就会进入一个无止境的数据更新

这问题不是数据库无法达到你想要的目的,
应该是你对业务的理解错误了

你的目的是要达到两表数据同步,按照这种
逻辑去理解。。你的两表根本不可能达到两表数据同步了

你的逻辑我理解为这样:
修改表a 的字段a 触发触发器a 触发器a修改表b的字段b 触发触发器b 触发器b修改表a的字段a
然后这个逻辑又开始重复了

你需要做到的是两个表数据同步,你的这个逻辑在理论上就是实现不了的 不知道楼主明白我的意思不

如果你要做到两表数据同步 只需要一个触发器足够了。。我估计是你业务还没理解清楚
yinan9 2012-02-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhouzh_yutu 的回复:]
引用 1 楼 yinan9 的回复:
可以考虑触发器啊


写了 但是不对 我现在写了一个对A表的 当A表修改或者增加删除的时候 对B表进行操作
然后右写了一个当B表操作的时候 A表变化
这样就导致 A表变化 触发了触发器 导致B表发生改变 然后B表变化了又触发了触发器
所以就报错了
[/Quote]嗯 这样的确会引起麻烦。坐等高人的手段
zhouzh_yutu 2012-02-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yinan9 的回复:]
可以考虑触发器啊
[/Quote]

写了 但是不对 我现在写了一个对A表的 当A表修改或者增加删除的时候 对B表进行操作
然后右写了一个当B表操作的时候 A表变化
这样就导致 A表变化 触发了触发器 导致B表发生改变 然后B表变化了又触发了触发器
所以就报错了
yinan9 2012-02-01
  • 打赏
  • 举报
回复
可以考虑触发器啊

2,668

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 认证与考试
社区管理员
  • 认证与考试社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧