oracle 约束的novalidate 应用

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

在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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7199859/viewspace-200321/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值