テーブル:
SIGN_OBJECT:
ID VARCHAR2(32) PRIMARY KEY,
DESCRIPTION VARCHAR2(100),
X NUMBER(10,3),
Y NUMBER(10,3),
...
GEOMETRYID VARCHAR2(32)
LAMPPOST_OBJECT:
ID VARCHAR2(32) PRIMARY KEY,
DESCRIPTION VARCHAR2(100),
X NUMBER(10,3),
Y NUMBER(10,3),
...
GEOMETRYID VARCHAR2(32)
OBJGEOMETRY:
GEOMETRYID VARCHAR2(32) PRIMARY KEY,
GEOMETRY MDSYS.SDO_GEOMETRY,
...
多くの X_OBJECT テーブルがあります。残念ながら、スキーマの設計者は (彼らの無限の知恵の中で) さまざまなオブジェクト タイプ間のクロスオーバーを認識していませんでした。より多くの作業を作成せずにこれらのテーブルを変更することはできません。
オブジェクト テーブルごとに、関連する SDO_GEOMETRY 値を挿入または更新の前に作成するトリガーがあります (GEOMETRYID は一意であり、シーケンスから取得されます)。現時点で、トリガーは、OBJGEOMETRY レコードを挿入してジオメトリ ID を返すパッケージ関数を呼び出します。
問題は、親レコードが削除された場合、OBJGEOMETRY 子レコードも削除したいということです。
当初、これは外部キーのカスケード削除で実行できると考えていましたが、もちろん、FK には親テーブルに主キーが必要です。明らかにこれは機能しません。
しかし、実際には FK には親テーブルに一意の制約が必要であることがわかりました。X_OBJECT.GEOMETRYID を一意にすることができますが、GEOMETRYID は親テーブルにまだ入力されていませんが、FK にはそれが存在する必要があるため、問題が見つかりました。トリガー内で( :NEW.GEOMETRYID を設定して)それを行うことはできないので、最初に GEOMETRYID を書き込んでからコミットする必要がありますか? よくわかりませんが、これにはコードの臭いがあります。
だから私は間違っていますか?これは、削除トリガーのより適切なケースですか? または、私が見逃しているものがあります。
ありがとう。