我做了一个视图,关联了2个表,然后我做了一个触发器,结果发现添加数据时,每次都增加了2条一样的数据。停止了触发器,就只有一条数据了。查了一些资料说:如果你的视图关联的表不是很复杂  就不要使用触发器,视图也会更新 数据表。复杂的就要用触发器了,可什么叫复杂呢?请高手指教

解决方案 »

  1.   

    可更新视图有以下三条规则:(1) 若视图是基于多个表使用联接操作而导出的,那么对这个视图执行更新操作时,每次只能影响其中的一个表。
    (2) 若视图导出时包含有分组和聚合操作,则不允许对这个视图执行更新操作。
    (3) 若视图是从一个表经选择、投影而导出的,并在视图中包含了表的主键字或某个候选键,这类视图称为‘行列子集视图’。对这类视图可执行更新操作。另外,关于可更新视图的一些更具体的描述如下:如果视图没有INSTEAD OF触发器,或者视图不是分区视图,则视图只有满足下列条件才可更新:select语句在选择列表中没有聚合函数,也不包含TOP,GROUP BY,UNION(除非视图是分区视图)或DISTINCT子句。聚合函数可以用在FROM子句的子查询中,只要不修改函数返回的值。select语句的选择列表中没有派生列。派生列是由任何非简单列表达式(使用函数、加法或减法运算符等)所构成的结果集列。select语句中的FROM子句至少引用一个表。select语句不能只包含非表格格式的表达式(即不是从表派生出的表达式)。INSERT, UPDATE和DELETE语句在引用可更新视图之前,也必须如上述条件指定的那样满足某些限制条件。只有当视图可更新,并且所编写的UPDATE或 INSERT语句只修改视图的FROM子句引用的一个基表中的数据时,UPDATE和INSERT语句才能引用视图。只有当视图在其FROM子句中只引用一个表时,DELETE语句才能引用可更新的视图。 
      

  2.   

    总结的  好详细啊我能不能让它自己的更新数据失效,而只使用触发器 更新数据呢?
    我的触发器如下:Create Or Replace Trigger “T_CHG_EMP_DEPART_VIEW" 
      Instead Of Insert or update or delete on
      ”EMP_DEPART_VIEW" 
      referencing OLD as OLD  NEW as NEW FOR EACH ROW 
    Declare
    begin
       If Inserting Then
          INSERT INTO EMP    
            VALUES
          ( :NEW.ID, :NEW.YGBH, :NEW.YGNAME, :NEW.YGBRITHDAY, :NEW.DEPARTID       );   elsif Updating Then
          UPDATE EMP
          SET 
            YGBH = :NEW.YGBH, 
            YGNAME = :NEW.YGNAME, 
            YGBRITHDAY = :NEW.YGBRITHDAY, 
            DEPARTID = :NEW.DEPARTID, 
            YGEDUCATION = :NEW.YGEDUCATION, 
            YGSPCIALTY = :NEW.YGSPCIALTY, 
            YGTITLE = :NEW.YGTITLE, 
            QUANXIAN = :NEW.QUANXIAN, 
            MIMA = :NEW.MIMA 
            WHERE
            (ID = :OLD.ID);   elsif Deleting then
          DELETE FROM EMP
         WHERE
          (ID = :OLD.ID);
       End if;
    end;
      

  3.   

    很急啊而且这个问题,我感觉是我把触发器写成这个形式 以后才有的问题,以前我写create trigger aa instead of insert on bb begin
    insert into ......
    end好像没有问题的郁闷啊,请高手指教
      

  4.   


    --测试了一下没有出现你说的问题,你仔细研究一下你自己的情况吧,应该是哪里没有注意到
    [TEST@myorcl] SQL>desc t1;
     名称                                      是否为空? 类型
     ----------------------------------------- -------- ----------------------------
     ID                                                 NUMBER
     COL2                                               NUMBER[TEST@myorcl] SQL>desc t3;
     名称                                      是否为空? 类型
     ----------------------------------------- -------- ----------------------------
     ID                                                 NUMBER
     COL2                                               NUMBER[TEST@myorcl] SQL>create or replace view my_view as
      2  select t1.id,t1.col2 from t1,t3 where t1.id=t3.id;视图已创建。[TEST@myorcl] SQL>create or replace trigger my_trigger
      2  instead of insert or update or delete on my_view
      3  begin
      4   if inserting then
      5    insert into t1 values(:new.id,:new.col2);
      6  end if;
      7  end;
      8  /
    触发器已创建[TEST@myorcl] SQL>select * from t1;        ID       COL2
    ---------- ----------
             1          2
             2          2[TEST@myorcl] SQL>insert into my_view values(3,4);已创建 1 行。[TEST@myorcl] SQL>commit;提交完成。[TEST@myorcl] SQL>select * from t1;        ID       COL2
    ---------- ----------
             1          2
             2          2
             3          4
      

  5.   

    如何在oracle里面,了解 insert到底触发了那些命令我仔细看了我的系统,真的没有找到 2次触发的地方有办法知道,这个插入命令 到底 触发了 那些 函数  和触发器吗?
      

  6.   

    我利用pl/sql developer  在触发器上设置了一个断点,利用测试窗口 发了一个
    insert视图的命令,结果 触发器 只触发了一下然而等我提交数据库后,在表里面还是有2个一样的记录
    为什么?