假设我有以下两个表。
create table contract(
c_ID number(1) primary key,
c_name varchar2(50) not null,
start date not null,
end date not null,
d_ID number(1) null,
constraint fk_discount_ID
foreign key(d_ID) references discount(d_ID)
);
create table discount(
d_ID number(1) primary key not null,
d_amount decimal(4,2) not null,
valid_from date,
valid_until date
);
现在,我想添加一个约束,以检查折扣在合同开始日期是否有效。例如,一份合同于2015年5月1日开始,并且折扣仅在2015年4月30日有效,而该折扣不适用于上述合同。
我该怎么做约束?
不幸的是,您不能使用约束执行这种复杂的验证。
虽然实际上有一种方法可以结合使用实例化视图和约束(请参阅我的博客),但我们通常不这样做,因为这可能会对性能产生不利影响。
触发器是一个选项,但是我会避免使用它们,因为它们很难正确使用,因此它们始终可以在多用户系统中正常工作。
这留下了最常见的方法(以我的经验):为执行业务规则的事务构建PL / SQL API,以便contract
像在应用程序中插入一行一样简单地调用API,如下所示:
contract_api.create_contract
( p_name => :name
, p_start => :start
, p_d_id => :d_id
...
);
该API在插入之前会验证业务规则,因此该调用可能会失败,并出现以下异常:
ORA-20001: Discount not valid on contract start date
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句