有两个部门A B其中B部门的信息是在A部门更新时候自动同步的,这两个是一个表CREATE TABLE DEMO
(
 DEPTID VARCHAR2(20),
 INFOID NUMBER;
 INFO   VARCHAR2(200)
)--例如表中原有数据
SELECT * FROM DEMO
------------------------------------------
'A',1,'测试数据1' 
'B',1,'测试数据1' 
--在执行
UPDATE DEMO SET INFO = '测试数据修改' WHERE DEPTID = 'A' AND INFOID = 1;
--对应的B数据也能变化
SELECT * FROM DEMO
------------------------------------------
'A',1,'测试数据修改' 
'B',1,'测试数据修改' 我现在试过了2中方法:
1.在行级触发器使用自治事务,勉强可以用,如果单独操作A部门或B部门的数据,没有大问题。
如果同时对A\B的数据进行UPDATE,数据库会检测到死锁,而且数据更新也不统一。
2.使用变异表,行级触发器和语句级触发器同时使用,运行时候提示超过递归SQL级别的最大值。
这里给出触发器的BODY--包的声明就不距离了
--行级触发器记录更新的内容
CREATE OR REPLACE TRIGGER T_DEMO
BEFORE UPDATE ON DEMO
FOR EACH ROW
WHEN (NEW.DEPTID = 'A' )
BEGIN
  PACKAGEDEMO.NUM := PACKAGEDEMO.NUM + 1
  PACKAGEDEMO.DEPTID(PACKAGEDEMO.NUM) = :NEW.DEPTID;
  PACKAGEDEMO.INFOID (PACKAGEDEMO.NUM) = :NEW.INFOID ;
  PACKAGEDEMO.INFO(PACKAGEDEMO.NUM) = :NEW.INFO;
END;
--语句触发器
CREATE OR REPLACE TRIGGER T_DEMO
BEFORE UPDATE ON DEMO
BEGIN
  FOR i IN 1..PACKAGEDEMO.NUM LOOP
   IF PACKAGEDEMO.DEPTID(i) = 'A' THEN
     UPDATE DEMO SET INFO = PACKAGEDEMO.INFO(i)
     WHERE DEPTID = PACKAGEDEMO.DEPTID(i) AND INFOID = PACKAGEDEMO.INFOID (i);
   END IF;
  END LOOP;
  PACKAGEDEMO.NUM := 0;
END;
说明:有这个问题的原因是因为在弄一个MSSQL迁移到ORACLE的事情,MSSQL对修改本表还是支持的。想在oracle实现同样的功能,请各位高手指教。