学习oracle技术,每天学一点,每天进步一点

oracle 约束的novalidate 应用

上一篇 / 下一篇  2008-03-05 09:25:14 / 个人分类:数据库维护

在项目开发过程中,遇到这样一个需求:

在tb_test表中加入触发器,实现如下规则检查ITPUB个人空间4r j Fl.P3}e4Kp
MIN>0,ITPUB个人空间}T,I#x'p&}.?M5f.M Q
MAX>MIN

如果insert或update时,数据违反规则,则抛出错误,sql语句执行不成功

这个功能用触发器可以实现,脚本如下:

create or replace trigger t_tb_testITPUB个人空间o2K&Wu9L;N|,`(qB8M
  before insert or update on TB_test
zn5})U_yD0  for each rowITPUB个人空间aqw.zxF O
declareITPUB个人空间0?HQn1oQ
  v_min number;

 v_diff number;

begin
%U7H9W/CvVbC-`X0  v_min:=:NEW.min;

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

if v_MIN<=0 thenITPUB个人空间DA5Oa0V
 RAISE_APPLICATION_ERROR(-20001,'min must bigger zero');
1A ngZe Uwk,g_W0end if;

if v_diff<=0 then
0}y R;~B0 RAISE_APPLICATION_ERROR(-20001,'diff must bigger zero');
F|"}*C t1{W0end if;ITPUB个人空间$r+aV~;[(Z
end t_tb_test;

但是考虑触发器对性能影响比较大,

改用oracle 自带的约束功能也可以实现 ,而且脚本简单

alter table TB_testITPUB个人空间[4`z!\4{
  add constraint GAME_TABle_testITPUB个人空间+g b0M(e}
  check (max>min);
:_?!x V7vmS0alter table TB_testITPUB个人空间#x"w lR(|)w S
  add constraint GAME_TABLE_test
$m%fW)?pjpW E7s0  check (min>0);

但是在实施脚本时,报错:

ora-02290:check_constraint(gr.tb_test) violated

一检查发现有发现有历史数据不符合约束规则;

所以必须用 novalidate 功能,才能加上去 脚本如下:

alter table TB_testITPUB个人空间 iP+Oar3UP$OT
  add constraint GAME_TABLE_testITPUB个人空间,q@~Hko
  check (min>0) NOVALIDATE;

 

 


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-10-13  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 20288
  • 日志数: 291
  • 图片数: 2
  • 建立时间: 2007-12-11
  • 更新时间: 2008-10-04

RSS订阅

Open Toolbar