SQL> desc mike_test0115;
Name Type         Nullable Default Comments 
---- ------------ -------- ------- -------- 
ID   NUMBER                                 
NAME VARCHAR2(40) Y     create or replace trigger temp
  before insert on mike_test0115  
  for each row
declarebegin
  
IF :new.ID = 0 then
    DBMS_OUTPUT.PUT_LINE('Insert');
    RAISE_APPLICATION_ERROR(-20055,'INVALID CODE');
END IF;
end temp;
---------------------------------------------------------------------
已连接到 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 
已连接为 mike
SQL> select * from mike_test0115;        ID NAME
---------- ----------------------------------------
         1 Mike
         2 JimmySQL> insert into mike_test0115 values(0,'test');insert into mike_test0115 values(0,'test')ORA-20055: INVALID CODE
ORA-06512: 在 "MIKE.TEMP", line 7
ORA-04088: 触发器 'MIKE.TEMP' 执行过程中出错SQL> select * from mike_test0115;        ID NAME
---------- ----------------------------------------
         1 Mike
         2 Jimmy

解决方案 »

  1.   

    阻止插入,我的理解是数据库发现不合法就什么也不做,而不是抛出异常,我觉得可以通过view+instead触发器来实现。
    如果是要抛出异常,对于楼主这个例子,完全可以用check来实现,不需要触发器。
      

  2.   

    是否抛出异常需要看阻止insert的规则,总不能所有的数据都不让Insert吧!
      

  3.   

    cenlmmx(学海无涯苦作舟) 已经回答了
      

  4.   

    check限制后,insert会出错的,我不希望出错.
      

  5.   

    既然不希望insert时出错,那么就不能采用在触发器中抛出异常的方法。
    我想到的只有通过view+instead触发器来实现。
      

  6.   

    请介绍view+instead触发器,谢谢!
      

  7.   

    instead of我知道, view+instead什么意思?
      

  8.   

    通过视图检查数据,然后用instead顶替原语句,这是我的理解
      

  9.   

    SQL> create table TABLE_A_base(
      2      id       number,
      3      t        date,
      4      amount   number
      5  );Table created.SQL>
    SQL> CREATE VIEW TABLE_A AS
      2     SELECT * FROM TABLE_A_base;View created.SQL> CREATE OR REPLACE TRIGGER TABLE_A_insert
      2     INSTEAD OF INSERT ON TABLE_A
      3  BEGIN
      4    if :NEW.amount>0 then
      5      insert into TABLE_A_base(id, t, amount)
      6          values (:NEW.id, :NEW.t, :NEW.amount);
      7    end if;
      8  END;
      9  /Trigger created.SQL> insert into TABLE_A values(1,sysdate,1);1 row created.SQL> insert into TABLE_A values(2,sysdate,0);1 row created.SQL> commit;Commit complete.SQL> select * from table_a;        ID T                       AMOUNT
    ---------- ------------------- ----------
             1 2006-01-19 15:59:46          1SQL>
      

  10.   

    不需要用视图吧,使用instead of触发器就可以了
      

  11.   

    晕,原来oracle的instead of触发器只能用在view上面,sqlserver的可以用在table上