现有表A,在此表上建立一个触发器,触发器的作用是在A表中记录发生变化后,读取表A的记录,在网上找资料说如果更新后,直接读的话属于脏读,有想过先将表中数据存到另一张临时表中,但是如果更新的话,临时表还是会出现同样的情况,所以求助各位大虾们有什么好的方法!

解决方案 »

  1.   

    貌似直接从inserted表中获取即可.
      

  2.   

    inserted对应的应该是:new对应的一条记录,应该是我的没有表述清晰,额,我想要在更新后读取的是整个表数据
      

  3.   

    commit么?试用过,不行,自治事务也试过了,也是不行
      

  4.   

    你可以把insert、update、delete放到一个存储过程中,这些操作commit后select结果返回以后对这张表的插入修改删除都通过调用此过程来实现
      

  5.   

    我的需求就是,现有表A和表B,更新表A中的一条或多条数据,同时更新表B中的数据,但是表
    B中的数据是根据表A中的好几条数据计算出来的,也就意味着要使用更新后的表A的数据。
      

  6.   

    针对这张表你写2个触发器呢?
    create or replace trigger tr_table
      before insert or update of tb_no on tablename
    ..................
    create or replace trigger tr_table2
      after insert or update of tb_no on tablename...................
      

  7.   

    三个方案:
    1. 修改触发器的逻辑,假设表B中的数据是根据表A中的数据求和得到的,那么在表A的触发器中对表B的记录进行差值计算即可。
    2. 修改触发器的触发条件为AFTER UPDATE,并且没有FOR EACH ROW子句。
    3. 修改业务层次逻辑,不要将该功能放在触发器中实现,而是放在前台或者通过存储过程来实现。
      

  8.   

    我写了一段代码,你可以试试
    1、建测试表
    create table TEST1
    (
      NAME VARCHAR2(20),
      CODE VARCHAR2(4),
      FULL VARCHAR2(50)
    )
    tablespace test
      pctfree 10
      initrans 1
      maxtrans 255
      storage
      (
        initial 64
        minextents 1
        maxextents unlimited
      );
      

  9.   

    2、建package
    create or replace package pkg_test1 as
      type t_gno is table of test1.code%type index by binary_integer;
      v_gno         t_gno;
      v_numbertries binary_integer := 0;
    end pkg_test1;
      

  10.   

    3、触发器1
    create or replace trigger tr_test1_row
      before insert or update of code on test1
      for each row
    begin
      pkg_test1.v_numbertries := pkg_test1.v_numbertries + 1;
      pkg_test1.v_gno(pkg_test1.v_numbertries) := :new.code;
    end tr_test1_row;
      

  11.   

    用那种非 for each row 触发器就可以了, 楼上已经给了例子我就不写了
      

  12.   

    谢谢你的提示,现阶段对存储过程还没有多少了解,所以使用触发器来实现,采用的是你上面提示的使用两个触发器,并结合了临时表,
    第一步是使用befor表级触发器,在这个触发器中将源表中数据数据存到临时表中
    第二步是after行级触发器,在这里能够知道修改的表记录,所以先根据:old的记录将临时表记录删除,然后在将:new的记录插入到临时表中,这样便可以在临时表中得到与源表一样的数据,这样便可以达到与读取源表一样的效果了。
    可能这样做的开销比较大,但目前使用这个方法还是能够达到读取数据的目的的。
      

  13.   

    非for each row的触发器除了表级的触发器还有???,如果是表级别的触发器那因为会因为使用更新的记录而无法达到目的!