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 레코드를 삽입하고 geometryid를 반환하는 패키지 함수를 호출합니다.
부모 레코드가 삭제되면 OBJGEOMETRY 하위 레코드도 삭제되기를 바랍니다.
처음에는 외부 키 캐스케이드 삭제로이 작업을 수행 할 수 있다고 생각했지만 물론 FK는 부모 테이블에 기본 키가 필요합니다. 분명히 작동하지 않습니다.
그러나 실제로 FK는 상위 테이블에서 고유 한 제약 조건이 필요하다는 것을 발견했습니다. 고유 한 X_OBJECT.GEOMETRYID를 만들 수 있지만 GEOMETRYID가 아직 부모 테이블에 채워지지 않았지만 FK가 존재해야하기 때문에 문제를 찾고 있습니다. 나는 트리거 (설정 : NEW.GEOMETRYID) 안에서 그렇게 할 수 없다. 그래서 GEOMETRYID를 먼저 써야하고 커밋해야 하는가? 나는 잘 모르겠다. 그리고 이것은 나쁜 코드 냄새를 가지고있다.
내가 틀렸어? 삭제 트리거에 더 적합한 경우입니까? 또는 내가 빠진 것이있다.
감사합니다.
외래 키는 참조 된 테이블의 고유 제한 조건을 필요로 ... 삭제 트리거가 필요합니다. 가장 보편적 인 유일한 제약 조건이지만 * 기본 키 * 제약 조건을 필요로하지 않습니다. –