2012-11-30 4 views
1

표 :외부 키 또는 삭제 트리거?

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를 먼저 써야하고 커밋해야 하는가? 나는 잘 모르겠다. 그리고 이것은 나쁜 코드 냄새를 가지고있다.

내가 틀렸어? 삭제 트리거에 더 적합한 경우입니까? 또는 내가 빠진 것이있다.

감사합니다.

+0

외래 키는 참조 된 테이블의 고유 제한 조건을 필요로 ... 삭제 트리거가 필요합니다. 가장 보편적 인 유일한 제약 조건이지만 * 기본 키 * 제약 조건을 필요로하지 않습니다. –

답변

0

삽입 또는 업데이트 전에 트리거가 실행되지 않아야합니다. 그런 다음 NEW.GEOMETRYID를 패키지가 리턴 한 값으로 설정할 수 있습니다.

게다가 외래 키가 잘못 가리 킵니다. 이것은 이어야합니다. ALTER TABLE x_OBJECT 외래 키 추가 (geometryid) 참조 objgeometry (geometryid);

따라서

+0

네, 그게 내 실수 였어. 위에 업데이트되었습니다. – Richard

+0

외래 키가 정상적으로 작동합니까? –

+0

다른 방법으로 말한 것처럼 그것은 외래 키가 아닙니다. 삭제 트리거입니다. – Richard

1

OBJGEOMETRY 및 X_OBJECT 행을 모두 동일한 트랜잭션에 삽입하면 FK를 DEFERRABLE INITIALLY DEFERRED으로 설정할 수 있습니다.

문을 실행할 때가 아니라 COMMIT 시간에이 값이 계산됩니다.

+0

매우 유용합니다! – Richard