テーブルに格納された階層構造があります。各要素には、その前、次、および親へのポインターがあります
create table CATALOGUE
(
NAME VARCHAR2(300) not null,
NEXT_ID NUMBER(38),
PARENT_ID NUMBER(38),
PREVIOUS_ID NUMBER(38),
XID NUMBER(38)
);
O/R マッピングを使用してこのテーブルにアクセスして変更する Java アプリケーションがあります。カタログが破損することがあります。たとえば、同じ親を持たないリンクされた要素です。Oracleトリガーまたは他の純粋なSQL手法(Javaコードなし)を使用してデータの一貫性を確保できるかどうか疑問に思っています。
これは物事を行う「正しい方法」ですか?
トリガーを実装するにはどうすればよいですか? テーブルを検証するストアド プロシージャを実装できます。何かのようなもの
select count(*)
from catalogue c1, catalogue c2
where c1.next_id = c2.previous_id and c1.parent_id != c2.parent_id
0 を返す必要があります。
しかし、コミット時にどのように呼び出すことができますか? テーブルが有効でない場合にロールバックする可能性があるコミットが終了する直前に、すべての行の更新でそれを呼び出したくありません。