2009-08-18 7 views
2

SQLite에는 외래 키 제약 조건을 적용하는 트리거를 생성하는 genfkey 유틸리티가 함께 제공됩니다. 다음은 source입니다. README도 있습니다. 이전 URL을 f = sqlite/tool/genfkey.README (stackoverflow는 하나의 url을 게시 만 허용)로 변경하십시오.SQLite의 외래 키 트리거

참조시 BEFORE INSERT 및 BEFORE UPDATE가 두 쌍씩 생성됩니다. 테이블 및 BEFORE DELETE 및 참조 테이블에서 AFTER UPDATE. 마지막 트리거가 다른 트리거와는 다르게 왜 발생했는지 알 수 없습니다. 원본의 741 줄을 보거나 "AFTER"를 검색하면 파일의 유일한 인스턴스입니다.

큰 거래는 아닙니다. 거래를하고 AFTER 트리거가 오류를 생성하면 롤백 할 수 있습니다. 아무도 아이디어가 다른 이유가 있는지 궁금합니다.

답변

2

삽입 된 행의 ROWID가 필요하기 때문에.

행이 삽입되면 ROWID가 생성되므로 BEFORE 트리거에서 사용할 수 없습니다.

이 모듈이 작동 정확히 어떻게 모르겠지만, ROWID 라인 755에서 참조 :도

", '/on_update/', on_update" 

", '/name/', 'genfkey' || min(rowid)" 
", '/tbl/', dq(from_tbl)" 

참조 : 진정한 외래 키 제약 조건이 마침내 안정에 지원하는 것을 http://linuxgazette.net/109/chirico1.html

+0

빙고 - 나는 CASCADE 케이스가 아닌 ON UPDATE RESTRICT 케이스 만 고려했습니다. 새 케 이블 ID를 사용하면 업데이트를 계단식으로 연결할 수 있습니다. 감사! –

+0

설명 - 트리거는 이전의 경우에도 업데이트 된 행 데이터에 대한 액세스를 수행합니다. BEFORE 문제는 캐스케이드가 시작된 경우 참조 FK 트리거가 실행되고 새 참조 데이터가 아직 적용되지 않은 경우 오류가 발생합니다. –