1785: Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths (FOREIGN KEY 제약 조건이 순환 또는 다중 cascade 경로를 만들 수 있음)
SQL Server의미
추가하려는 외래 키가 cascade(ON DELETE/UPDATE CASCADE) 작업에서 순환이나 같은 테이블로 향하는 다중 cascade 삭제/갱신 경로를 만들 수 있다. SQL Server는 모호한 cascade 동작을 피하기 위해 이를 거부한다.
원인
cascade 동작이 있는 FK가 테이블 간 순환 참조(A->B->A)나 한 테이블로 향하는 다중 cascade 경로를 만드는 경우다. SQL Server는 모호한 cascade 순서와 무한 루프를 막기 위해 이를 허용하지 않는다.
해결 방법
외래 키를 ON DELETE NO ACTION / ON UPDATE NO ACTION으로 정의한다(cascade 제거): ALTER TABLE child ADD CONSTRAINT fk ... FOREIGN KEY (...) REFERENCES parent(...) ON DELETE NO ACTION; 필요한 연쇄 삭제는 INSTEAD OF DELETE 트리거로 구현한다: 트리거가 먼저 자식 행을 삭제한 후 부모 행을 삭제한다(예: DELETE c FROM child c JOIN deleted d ON c.parent_id = d.id; DELETE e FROM parent e JOIN deleted d ON e.id = d.id;). AFTER DELETE 트리거는 동작하지 않는다. FK 검사가 트리거보다 먼저 실행되므로 삭제가 오류 547로 거부된다. 데이터 모델의 순환 의존성을 검토한다.
같은 데이터베이스의 다른 항목
- 1101Could not allocate a new page because of insufficient disk space in filegroup (파일 그룹의 디스크 공간 부족으로 새 페이지를 할당할 수 없음)
- 3729Cannot DROP because it is being referenced by object (객체가 참조 중이어서 DROP 불가)
- 3961Snapshot isolation transaction failed because the object was modified by a DDL statement (객체가 DDL로 변경되어 스냅샷 격리 트랜잭션 실패)
- 9421XML parsing: illegal xml character
- 15151Cannot find the object/principal because it does not exist or you do not have permission (객체/보안 주체가 존재하지 않거나 권한이 없어 찾을 수 없음)
- 4834You do not have permission to use the bulk load statement (bulk load 문을 사용할 권한 없음)
- 10928Resource limit for the database has been reached (Azure SQL) (데이터베이스 리소스 한도 도달)