有没有办法让oracle通过约束检查表的其他记录?
我们举一个例子:
我有一个名为ENI_TRASC_VOCI_PWR_FATT
的表,我希望每个tvp_regione
非空的记录都有类似的记录tvp_regione
= null。
对于类似的记录,我需要检查它在TVP_CODICE_ASSOGGETAMEN
列上的值是否相同。
答案 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;
但要小心!触发器不像约束 - 想想如果两个用户更新表等会发生什么......