문제

프로젝트에서 파일과 종속성을 추적하는 데이터베이스에서 작업하고 있습니다. 간단히 말해서, 나는 두 개의 메인 테이블이 있습니다. 프로젝트 테이블에는 프로젝트 이름 및 기타 속성이 나열되어 있으며 파일 테이블에는 파일이 나열됩니다. 모든 파일 항목은 프로젝트를 캐스케이드로 설정하는 외국 키로 포인트를 가리므로 데이터베이스에서 프로젝트 레코드를 삭제하면 모든 파일 레코드도 사라집니다. 여태까지는 그런대로 잘됐다.

이제 추가 종속성 테이블이 있습니다. 종속성 테이블의 각 레코드는 두 파일로 첫 번째 파일이 두 번째 파일에 의존하도록 지정합니다. 다시 이들은 외국 키이며 첫 번째는 캐스케이드로 설정되어 있습니다 (따라서 파일 항목을 삭제하면이 레코드가 삭제됩니다). 두 번째는 제한되도록 설정됩니다 (따라서 다른 파일이 의존하는 경우 파일 항목을 삭제할 수 없습니다. 그 위에). 다시, 모든 것이 좋아 보인다.

불행히도 단일 SQL 삭제 명령문으로 더 이상 프로젝트를 삭제할 수없는 것 같습니다! 삭제는 파일을 캐스케이드로 만들려고 시도하지만 종속성 테이블 에이 중 하나라도 표시되면 제한이 키가 삭제를 방지합니다 (다른 열이 캐스케이드이기 때문에 종속성 테이블의 해당 레코드가 제거 되더라도). 내가 가진 유일한 해결 방법은 파일을 삭제하기위한 정확한 순서를 계산하여 종속성 레코드 제약 조건을 위반하지 않고 프로젝트를 제거하기 전에 파일 레코드를 한 번에 하나씩 제거하는 것입니다.

프로젝트 테이블에서 단일 SQL 삭제가 다른 삭제를 올바르게 캐스케이드 할 수 있도록 데이터베이스 스키마를 설정하는 방법이 있습니까? 파이어 버드 2.1을 사용하고 있지만 그 차이가 있는지 모르겠습니다.이 작업을 수행 할 방법이 있어야하는 것 같습니다.

도움이 되었습니까?

해결책

계단식 외국 키를 통해 삭제 순서를 제어 할 수는 없지만 트리거를 설계 할 수 있습니다. PROJECTS 행을 삭제합니다 FILES 이 프로젝트에 속하며 DEPENDENCIES 다른 것에 의존합니다 FILES. 만들어주세요 BEFORE DELETE 트리거이므로 계단식 효과 전에 실행해야합니다.

이 같은:

CREATE TRIGGER Del_Child_Files FOR PROJECTS
BEFORE INSERT
AS BEGIN
  FOR SELECT F.FILE_ID FROM FILES F JOIN DEPENDENCIES D 
      ON F.FILE_ID = D.CHILD_ID
    WHERE F.PROJECT_ID = OLD.PROJECT_ID
    INTO :file_id
  DO
    DELETE FROM FILES WHERE FILE_ID = :file_id;
  DONE
END

따라서 프로젝트를 삭제하면 다른 파일에 의존하는 프로젝트의 모든 "자식"파일을 삭제 하고이 캐스케이드가 행을 삭제합니다. DEPENDENCIES 따라서 나머지 모든 파일에는 종속성이 없습니다. 프로젝트 삭제가 이제 캐스케이드하여 이러한 파일을 삭제할 수 있습니다.

나는 이것을 테스트하지 않았고 내 Firebird 구문은 녹슬지 않을 수도 있지만 아마도 당신을 시작하게 될 것입니다.

분명히, 라이브 데이터가 아니라 데이터 사본에서 이것을 테스트하십시오!

다른 팁

시스템은 연기 된 제약 조건을 지원합니까?

어쩌면 그것은 단지 오라클 일 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top