在项目开发过程中,遇到这样一个需求:
在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/