学习oracle技术,每天学一点,每天进步一点
oracle 约束的novalidate 应用
上一篇 /
下一篇 2008-03-05 09:25:14
/ 个人分类:数据库维护
在项目开发过程中,遇到这样一个需求:
在tb_test表中加入触发器,实现如下规则检查ITPUB个人空间4rj Fl.P3}e4Kp
MIN>0,ITPUB个人空间}T,I#x'p&}.?M5f.MQ
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个人空间D A5Oa0V
RAISE_APPLICATION_ERROR(-20001,'min must bigger zero');
1A ngZe Uwk,g_W0end if;
if v_diff<=0 then
0}yR;~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(|)wS
add constraint GAME_TABLE_test
$m%fW)?p jpW 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: