0

我有以下选择语句,我在一个函数中使用它来检查记录的重叠,这个函数是从应用程序前端调用的。

SELECT count(*),product_no 
from products p where lower(p.PRODUCT_REG_NO) ='GB-UNIGAS' 
and (NVL (p.return_date, p.end_date) >= '01-Jan-2015') 
and p.product_no in (select product_no from PRODUCT_MASTER  where  EXPIRED='N' 
                    and product_no  = p.product_no)

我想在表中创建一个约束,而不是检查记录重叠的函数,这样即使在数据库级别也不会有任何插入或更新。

如何使用上述 sql 语句创建约束?

任何帮助都是非常可观的。

谢谢

4

2 回答 2

3

您可以创建一个插入前或更新触发器,检查您的条件,如果新数据不符合您的要求,则引发错误。此链接将为您提供帮助。

于 2012-09-24T08:39:12.523 回答
1

在存储过程中保留这种逻辑是一个不错的选择。尝试在触发器中实现该逻辑,并且以某种方式最终会看到

ORA-04091: table <your table> is mutating, trigger/function may not see it

例如,在触发器中实现该功能将允许您使用insertlike

insert into <Yourtable> (<col1>...<coln>)
   values(val1... valn)

mutating table但是如果你尝试insert像这样执行你肯定会得到一个错误

 insert into <Yourtable> (<col1>...<coln>)
    select col1, .. coln 
      from some_table

如果您不想使用存储过程,您的另一个选择可能viewinstead of trigger

Create or replace view <ViewName> as
  select *
    from your_table;

 create or replace trigger <Trigger_name> 
   instead of insert on <View_Name>
 begin
   -- your logic
 end;

此外

此外,要通过约束 (constraint) 强制执行业务规则CHECK,您可以组合CHECK约束,materialized view如下所示: 为您的表创建物化视图(不要忘记在materialized view log之前创建),该视图将查询违反业务规则约束的数据。

 Create materialized view MV_1
  refresh complete on commit as
  --here goes your query
  -- selecting data you want to raise exception on

添加check始终为假的约束。像这样的东西

alter table MV_1 add constraint CHK check(1=2) deferrable;

完成后,check constraint <..> violated当您尝试在表中插入违反业务规则约束的数据时,您将得到。

于 2012-09-24T10:24:00.743 回答