2017-02-11 12 views
0

要件に応じて、固有の状況に直面しています。特定のサブミッターIDのみの表に仮想プライマリ・キーを作成したいと考えています。注:サブミッターIDは、表内の列の1つです。 [ORA-04091:表XYZが突然変異しており、トリガー/機能がそれを認識しない可能性があります]この場合、トリガーを使用することを決定しましたが、Oracle PLSQLトリガーのロジックのようなプライマリ・キーを作成中のコンパイル

ワークフローを理解するためのサンプル例:Submitte場合シーケンス

テーブル構造(シーケンス、Submitter_id、国、説明)

一意の主キーをr_id = 'SYSTEM'では、Countryに仮想プライマリキーの何かが必要です。更新中にエラーを与えているテーブルXYZのBEFORE INSERT OR UPDATEトリガのための

現在のコード:事前に

If (:NEW.Submitter_Id = 'SYSTEM') Then 
    BEGIN 
     SELECT count(1) INTO counterVariable 
     FROM XYZ 
     WHERE Country = :NEW.Country 
     And Submitter_Id = 'SYSTEM'; 
    EXCEPTION 
     WHEN OTHERS THEN 
     raise_application_error(-20005, 'Sample Error'); 
    END; 

    If (counterVariable != 0) 
    Then 
     raise_application_error(-20005, 'Primary Key Violation error'); 
    End If; 

End If; 

感謝。

+0

http://stackoverflow.com/questions/17609844/how-to-make-a-trigger-like-primary-key-constraint同様の質問が、どの具体的な解決策なし。プライマリキー制約やユニークなインデックスを伴わない私の問題を解決するための回避策を探しています。 – pOrinG

答えて

1

トリガで行う必要はありません。私は機能的にユニークなインデックスを作成するだけです。

create unique index xyz_unq on xyz(decode(submitter_id, 'SYSTEM', country)); 
+0

お返事ありがとうございます。しかし実際のシナリオでは、1つの国(国)ではなく4つの列があります。 – pOrinG

+0

私はそれがまだインデックスで行うことができると思います。単にDECODEの代わりにCASE文を使用してください。 –

+0

ああ、あなたが言った、 "国の代わりに..."それはさらに簡単です。 4つのDECODEを使用して4つの列に機能インデックスを作成します。 –

関連する問題