Oracleに制約によってテーブルの他のレコードをチェックさせる方法はありますか?
例を見てみましょう:
というテーブルがENI_TRASC_VOCI_PWR_FATT
あり、nullを持たないすべてのレコードに、 =nulltvp_regione
を持つ同様のレコードが必要です。tvp_regione
同様のレコードについては、列で同じ値を持っていることを確認する必要がありますTVP_CODICE_ASSOGGETAMEN
。
Oracleに制約によってテーブルの他のレコードをチェックさせる方法はありますか?
例を見てみましょう:
というテーブルがENI_TRASC_VOCI_PWR_FATT
あり、nullを持たないすべてのレコードに、 =nulltvp_regione
を持つ同様のレコードが必要です。tvp_regione
同様のレコードについては、列で同じ値を持っていることを確認する必要があります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
/
rows_per_tca = 2 の場合、tvp_regione_per_tca = 1 のように、MV テーブルに定期的なチェック制約を設定します (要件は私には明確ではありません)。
一般に、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;
でも気をつけて!トリガーは制約とは異なります。2 人のユーザーがテーブルを更新するとどうなるかなどを考えてみてください。