0

Oracleに制約によってテーブルの他のレコードをチェックさせる方法はありますか?

例を見てみましょう:

というテーブルがENI_TRASC_VOCI_PWR_FATTあり、nullを持たないすべてのレコードに、 =nulltvp_regioneを持つ同様のレコードが必要です。tvp_regione

同様のレコードについては、列で同じ値を持っていることを確認する必要がありますTVP_CODICE_ASSOGGETAMEN

4

2 に答える 2

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
/

rows_per_tca = 2 の場合、tvp_regione_per_tca = 1 のように、MV テーブルに定期的なチェック制約を設定します (要件は私には明確ではありません)。

一般に、Oracle でこのような複数行の制約を実装する唯一の安全な方法は、テーブルを変更する前に変更のためにテーブルをロックし、コードを使用してチェックすることです。

于 2012-05-23T13:18:16.990 に答える
1

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 人のユーザーがテーブルを更新するとどうなるかなどを考えてみてください。

于 2012-05-23T12:39:13.640 に答える