Oracle:涉及其他记录的复杂约束

时间:2012-05-23 10:54:03

标签: oracle constraints

有没有办法让oracle通过约束检查表的其他记录?

我们举一个例子:

我有一个名为ENI_TRASC_VOCI_PWR_FATT的表,我希望每个tvp_regione非空的记录都有类似的记录tvp_regione = null。

对于类似的记录,我需要检查它在TVP_CODICE_ASSOGGETAMEN列上的值是否相同。

2 个答案:

答案 0 :(得分:3)

我能想到的唯一方法是在刷新物化视图上使用快速提交,使用如下查询定义:

select
  tvp_codice_assoggetamen,
  count(*)           rows_per_tca,
  count(tvp_regione) tvp_regione_per_tca
from
  eni_trasc_voci_pwr_fatt
group by
  tvp_codice_assoggetamen
/

在MV表上放置常规检查约束,如果rows_per_tca = 2,则tvp_regione_per_tca = 1(您的要求对我来说不太清楚)。

这通常是在Oracle中实现这种多行约束的唯一安全方法,而不是在修改表之前锁定表以及使用代码进行检查。

答案 1 :(得分:1)

根据Oracle docs

  

检查条件的条件不能包含以下内容   构建:
      子查询和标量子查询表达式

所以你可能不得不使用触发器:

create or replace trigger trg
before insert or update on ENI_TRASC_VOCI_PWR_FATT
for each row

begin
   -- do whatever queries you need - I didn't understand what you want
   if <some condition> then
     raise_application_error(-20000,'no good');
   end if;
end;

但要小心!触发器不像约束 - 想想如果两个用户更新表等会发生什么......