有没有办法让oracle通过约束检查表的其他记录?
举个例子:
我有一个名为的表ENI_TRASC_VOCI_PWR_FATT
,我希望每条tvp_regione
不为 null 的记录都有一条类似的记录tvp_regione
= null。
对于类似的记录,我需要检查它在列上是否具有相同的值TVP_CODICE_ASSOGGETAMEN
。
有没有办法让oracle通过约束检查表的其他记录?
举个例子:
我有一个名为的表ENI_TRASC_VOCI_PWR_FATT
,我希望每条tvp_regione
不为 null 的记录都有一条类似的记录tvp_regione
= null。
对于类似的记录,我需要检查它在列上是否具有相同的值TVP_CODICE_ASSOGGETAMEN
。
我能想到的唯一方法是在刷新物化视图上使用快速提交,使用如下查询定义:
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 表上放置常规检查约束,例如 tvp_regione_per_tca = 1 如果 rows_per_tca = 2(您的要求对我来说不是很清楚)。
这通常是在 Oracle 中实现这种多行约束的唯一安全方法,没有在修改表之前锁定表以进行更改并使用代码进行检查。
根据Oracle 文档:
检查约束条件不能包含以下构造:
子查询和标量子查询表达式
所以你可能不得不使用触发器:
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;
但要小心!触发器不像约束 - 想想如果两个用户更新表会发生什么......