解决方案 »

  1.   


    由于oracle不能对正在被触发的table进行操作(ora-04091),所以这里先对table建一个view:
    --create view
    create view vtest as select * from t_post;
    --然后在view上建触发器,以后每次就通过修改view来修改原表
    create or replace trigger aftUpdBestAnswer_t
     INSTEAD OF INSERT OR UPDATE ON v_t_test
      FOR EACH ROW
    declare
    begin
      if :new.ifBest = 'true' then
        update t_post set ifEnd = '截题', endTime = sysdate;
      end if;
    end aftUpdBestAnswer_t;
    还有一种方法是建立一个临时table,在原table上建立一个trigger来修改临时表,临时表上也建立一个trigger,当临时表被修改时触发trigger来修改原表。
    其他两个题你可以自己考虑一下
      

  2.   


    由于oracle不能对正在被触发的table进行操作(ora-04091),所以这里先对table建一个view:
    --create view
    create view vtest as select * from t_post;
    --然后在view上建触发器,以后每次就通过修改view来修改原表
    create or replace trigger aftUpdBestAnswer_t
     INSTEAD OF INSERT OR UPDATE ON v_t_test
      FOR EACH ROW
    declare
    begin
      if :new.ifBest = 'true' then
        update t_post set ifEnd = '截题', endTime = sysdate;
      end if;
    end aftUpdBestAnswer_t;
    还有一种方法是建立一个临时table,在原table上建立一个trigger来修改临时表,临时表上也建立一个trigger,当临时表被修改时触发trigger来修改原表。
    其他两个题你可以自己考虑一下
    我想问下,第二题 牵扯到三个表,但 触发器只能多一个表操作,怎么办?
      

  3.   


    由于oracle不能对正在被触发的table进行操作(ora-04091),所以这里先对table建一个view:
    --create view
    create view vtest as select * from t_post;
    --然后在view上建触发器,以后每次就通过修改view来修改原表
    create or replace trigger aftUpdBestAnswer_t
     INSTEAD OF INSERT OR UPDATE ON v_t_test
      FOR EACH ROW
    declare
    begin
      if :new.ifBest = 'true' then
        update t_post set ifEnd = '截题', endTime = sysdate;
      end if;
    end aftUpdBestAnswer_t;
    还有一种方法是建立一个临时table,在原table上建立一个trigger来修改临时表,临时表上也建立一个trigger,当临时表被修改时触发trigger来修改原表。
    其他两个题你可以自己考虑一下
    我想问下,第二题 牵扯到三个表,但 触发器只能多一个表操作,怎么办?
    可以对一个表操作,如下:create table t1 (a number);create table t2 (a number);create table t3 (a number);create table t4 (a number);create or replace trigger tri_t1
      before insert on t1
      for each row
    declare
      -- local variables here
    begin
      insert into t2 values (:new.a);
      insert into t3 values (:new.a);
      insert into t4 values (:new.a);
    end tri_t1;insert into t1 values(1);