有什麼辦法讓oracle通過約束來檢查表的其他記錄嗎?Oracle:涉及其他記錄的複雜約束
讓我們舉個例子:
我有一個表叫ENI_TRASC_VOCI_PWR_FATT
,我想這有tvp_regione
不爲空每條記錄具有tvp_regione
= NULL類似的記載。
對於類似的記錄,我需要檢查它在TVP_CODICE_ASSOGGETAMEN
柱上具有相同的值。
有什麼辦法讓oracle通過約束來檢查表的其他記錄嗎?Oracle:涉及其他記錄的複雜約束
讓我們舉個例子:
我有一個表叫ENI_TRASC_VOCI_PWR_FATT
,我想這有tvp_regione
不爲空每條記錄具有tvp_regione
= NULL類似的記載。
對於類似的記錄,我需要檢查它在TVP_CODICE_ASSOGGETAMEN
柱上具有相同的值。
根據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;
但要小心!一個觸發器不是一個約束 - 想想如果兩個用戶更新表,等等會發生什麼......
我能想到的唯一方法是在刷新物化視圖上使用快速提交,使用查詢是這樣的:在MV表
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
/
將定期檢查約束,使得tvp_regione_per_tca = 1,如果rows_per_tca = 2(你的要求是不是很清楚,我)。
這通常是在Oracle中實現這種多行約束的唯一安全方式,在修改表和修改代碼以檢查之前,無法鎖定表。
所以你有雙記錄?一個null,一個不null? – APC
由於Oracle對CHECK約束條件的限制,我認爲您將不得不使用觸發器(可能是BEFORE INSERT或UPDATE ON ENI_TRAC_VOCI_PWR_FATT)來執行此驗證。 –
@APC:是的,正確 – Revious