0

レコードの重複をチェックする関数で使用している次のselectステートメントがあり、この関数はアプリケーションのフロントエンドから呼び出されます。

SELECT count(*),product_no 
from products p where lower(p.PRODUCT_REG_NO) ='GB-UNIGAS' 
and (NVL (p.return_date, p.end_date) >= '01-Jan-2015') 
and p.product_no in (select product_no from PRODUCT_MASTER  where  EXPIRED='N' 
                    and product_no  = p.product_no)

レコードの重複をチェックする関数の代わりに、データベースレベルでも挿入や更新が行われないように、テーブルに制約を作成したいと思います。

上記のSQLステートメントで制約を作成するにはどうすればよいですか?

どんな助けでも非常に高く評価されます。

ありがとう

4

2 に答える 2

3

挿入前または更新トリガーを作成し、条件を確認し、新しいデータが要件を満たしていない場合はエラーを発生させることができます。このリンクはあなたを助けます。

于 2012-09-24T08:39:12.523 に答える
1

この種のロジックをストアドプロシージャに保持することは良い選択です。そのロジックをトリガーに実装してみてください。何らかの方法で、最終的には

ORA-04091: table <your table> is mutating, trigger/function may not see it

たとえば、トリガーにそれを実装すると、次のように使用できるinsertようになります

insert into <Yourtable> (<col1>...<coln>)
   values(val1... valn)

しかし、このようmutating tableに実行しようとすると、間違いなくエラーが発生しますinsert

 insert into <Yourtable> (<col1>...<coln>)
    select col1, .. coln 
      from some_table

ストアドプロシージャを使用したくない場合は、他の選択肢としてviewinstead of trigger

Create or replace view <ViewName> as
  select *
    from your_table;

 create or replace trigger <Trigger_name> 
   instead of insert on <View_Name>
 begin
   -- your logic
 end;

更に

また、制約(制約)を介してビジネスルールを適用するには、次のように制約をCHECK組み合わせることができます。ビジネスルールの制約に違反するデータをクエリするテーブルのマテリアライズドビューを作成します(前に作成することを忘れないでください)。CHECKmaterialized viewmaterialized view log

 Create materialized view MV_1
  refresh complete on commit as
  --here goes your query
  -- selecting data you want to raise exception on

check常にfalseになる制約を追加します。このようなもの

alter table MV_1 add constraint CHK check(1=2) deferrable;

これを行うとcheck constraint <..> violated、ビジネスルールの制約に違反するデータをテーブルに挿入しようとしたときに得られます。

于 2012-09-24T10:24:00.743 に答える