2011-01-12 4 views
0

사용자 테이블 (User)이 있고 다른 사용자를 참조한 사용자를 추적하기 위해 새 테이블을 만들어야합니다. 그래서 기본적으로 동일한 테이블의 행 사이에 다 대다 관계를 만듭니다.SQL Server 오류를 이해하지 못함

그래서 UserId 및 UserReferredId 열이있는 테이블 UserReferrals를 만들려고합니다. 두 열을 모두 복합 기본 키로 만들었습니다. 두 열 모두 User.UserID에 연결된 외래 키입니다.

사용자를 삭제해도 관계를 삭제해야하므로 외래 키를 모두 계단식 삭제로 설정합니다. 사용자가 삭제되면 UserReferrals의 관련 행도 삭제해야합니다.

그러나이 나에게 메시지를 제공합니다 :

'User' table saved successfully 'UserReferrals' table Unable to create relationship 'FK_UserReferrals_User'. Introducing FOREIGN KEY constraint 'FK_UserReferrals_User' on table 'UserReferrals' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint. See previous errors.

나는이 오류가 발생하지 않습니다. 계단식 삭제는 외래 키가있는 행만 삭제합니다. 맞습니까? 그렇다면 어떻게 "사이클링 캐스케이드 경로"가 발생할 수 있습니까?

모든 정보 주셔서 감사합니다.

+0

우연히 외래 키 제약 조건 중 하나를 실수로 설정하지 않았습니까? –

+0

방금 ​​다시 좋은 측정을 확인했습니다. 두 열 모두 User 테이블을 기본 키 테이블로, UserReferrals를 외래 키 테이블로 표시합니다. –

답변

0

이것에 대해 생각하면, 나는 그것이 여러 캐스케이드 경로 관련이있을 수 있으므로 문제가 많은 너무 많은 순환 캐스케이드 경로와 관련이없는 생각하기 시작하고있다.

내 가입 테이블에있는 두 개의 UserID는 항상 다르지만 둘이 동일하지는 않습니다. 둘 다 동일한 사용자를 참조하고 해당 사용자가 삭제 된 경우 조인 테이블에 여러 개의 계단식 경로가 있습니다.

1

(A)와 (B)를 참조하는 테이블 (A) 또는 동일한 테이블에서 PK를 참조하는 FK가있는 경우 시나리오를 소개 할 수 있습니다 사이클이 반복됩니다. 때로는 논리적으로 가능하지 않지만 순수한 이론에서는 SQL 엔진의 관점에서 볼 때 가능합니다.

이것은 피할 수 없습니다. 일반적으로 SP에서 처리합니다 (EF에서는 delete 메소드에 매핑 할 수 있음).

+0

외래 키가 어떻게 순환 할 수 있는지 자세히 설명해 주시겠습니까? FK 쪽만 폭포가되어, 맞지? 그렇다면 관계의 PK 측에 어떻게 캐스케이드가 발생할 수 있습니까? –

+0

[사용자] 테이블에 [UserReferals]와 (과) 관계를 통해 참조가 다시 있습니다.따라서 사용자 A가 사용자 B를 "참조"하고 사용자 B가 사용자 A를 참조하여 순환 계단식 시나리오를 유발할 수있는 가능성이 있습니다. "PK 측의 관계"가 의미하는 바는 PK도 제약 조건의 대상이거나 테이블 자체를 참조 할 때입니다. – lukiffer

+0

미안하지만, 나는 그것을 얻지 못하고 있지만, 두 칼럼 모두 관계의 FK쪽에있다. 따라서 모든 계단식은 UserReferrals 테이블에서 끝납니다. 즉, 관계의 PK 측에서 계단식 연결 만하기 때문에 관계의 FK 측에서 삭제가 수행되지 않습니다. 내 사고가 어디서 잘못되고 있는지 보시겠습니까? –

0

계단식 삭제를 허용하려는 경우 다른 사용자의 UserReferredId 입력란에 UserId가 표시된 사용자를 삭제하면 해당 사용자도 삭제됩니다. 나는 당신이 원하는 UserName에 대한 값이 묶여있는 User가 삭제되면 null로 설정하는 것을 원한다고 생각한다.

삭제 명령의 테이블 트리거에서부터 삭제를 위해 저장 프로 시저를 사용할 때까지 여러 가지 방법이 있습니다. 트리거가 악을 인수하는 무시, 하나는 같은 것을 만들 수 있습니다

하는 사용자에 트리거 clearUserReferredIdOnUserDelete 후 삭제를 만듭니다 으로 업데이트 사용자 UserReferredId = null의 경우 UserReferredId 있음 (삭제에서 사용자 ID를 선택)

안된입니다하지만 정상적으로 설정 가깝다.

P

+0

사용자 중 하나가 삭제되면 관계가 삭제되어야하며 null로 설정되어서는 안됩니다. 두 열 모두 관계의 FK면에 있기 때문에 어떻게 다른 것이 삭제 될 수 있는지 알 수 없습니다. 사용자의 행을 삭제 한 경우에만 삭제할 수 있습니다. –

관련 문제