oracle 約束的novalidate 應用

paulyibinyi發表於2008-03-05

在專案開發過程中,遇到這樣一個需求:

在tb_test表中加入觸發器,實現如下規則檢查
MIN>0,
MAX>MIN

如果insert或update時,資料違反規則,則丟擲錯誤,sql語句執行不成功

這個功能用觸發器可以實現,指令碼如下:

create or replace trigger t_tb_test
  before insert or update on TB_test
  for each row
declare
  v_min number;

 v_diff number;

begin
  v_min:=:NEW.min;

 v_diff:=:NEW.MAX-:NEW.MIN

if v_MIN<=0 then
 RAISE_APPLICATION_ERROR(-20001,'min must bigger zero');
end if;

if v_diff<=0 then
 RAISE_APPLICATION_ERROR(-20001,'diff must bigger zero');
end if;
end t_tb_test;

但是考慮觸發器對效能影響比較大,

改用oracle 自帶的約束功能也可以實現 ,而且指令碼簡單

alter table TB_test
  add constraint GAME_TABle_test
  check (max>min);
alter table TB_test
  add constraint GAME_TABLE_test
  check (min>0);

但是在實施指令碼時,報錯:

ora-02290:check_constraint(gr.tb_test) violated

一檢查發現有發現有歷史資料不符合約束規則;

所以必須用 novalidate 功能,才能加上去 指令碼如下:

alter table TB_test
  add constraint GAME_TABLE_test
  check (min>0) NOVALIDATE;

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7199859/viewspace-200321/,如需轉載,請註明出處,否則將追究法律責任。

相關文章