0

다음 표가 설정되어 있습니다.SQL Sever 2008의 계단식 삭제가 작동하지 않습니다.

Bag 
    | 
    +-> BagID (Guid) 
    +-> BagNumber (Int) 

BagCommentRelation 
    | 
    +-> BagID (Int) 
    +-> CommentID (Guid) 

BagComment 
    | 
    +-> CommentID (Guid) 
    +-> Text (varchar(200)) 

BagCommentRelation에는 외래 키와 BagComment가 있습니다.

그래서 외래 키에 대한 계단식 삭제를 설정했지만 가방을 삭제해도 메모 행은 삭제되지 않습니다.

트리거를 트리거해야하나요? 또는 나는 무엇인가 놓치고 있냐?


주 (I는 SQL Server 2008을 사용하고 있습니다) : 게시는 SQL을 요청했다. 이것은 BagCommentRelation 테이블의 정의입니다. (필자는 bagID의 잘못 (나는 그것이 GUID했지만 그것이 int이며 생각)의 유형을했다.)

CREATE TABLE [dbo].[Bag_CommentRelation](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [BagId] [int] NOT NULL, 
    [Sequence] [int] NOT NULL, 
    [CommentId] [int] NOT NULL, 
CONSTRAINT [PK_Bag_CommentRelation] PRIMARY KEY CLUSTERED 
(
    [BagId] ASC, 
    [Sequence] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

ALTER TABLE [dbo].[Bag_CommentRelation] WITH CHECK ADD CONSTRAINT [FK_Bag_CommentRelation_Bag] FOREIGN KEY([BagId]) 
REFERENCES [dbo].[Bag] ([Id]) 
ON DELETE CASCADE 
GO 

ALTER TABLE [dbo].[Bag_CommentRelation] CHECK CONSTRAINT [FK_Bag_CommentRelation_Bag] 
GO 

ALTER TABLE [dbo].[Bag_CommentRelation] WITH CHECK ADD CONSTRAINT [FK_Bag_CommentRelation_Comment] FOREIGN KEY([CommentId]) 
REFERENCES [dbo].[Comment] ([CommentId]) 
ON DELETE CASCADE 
GO 

ALTER TABLE [dbo].[Bag_CommentRelation] CHECK CONSTRAINT [FK_Bag_CommentRelation_Comment] 
GO 

를이 테이블에있는 행은 코멘트 테이블의 행하지 않지만 삭제합니다.

답변

1

Bag을 삭제하면 BagComment 레코드가 삭제되지 않고 BagCommentRelation 레코드 만 삭제됩니다. 삭제는 Bag에서 BagCommentRelation으로 캐스케이드되지만 거기서 멈 춥니 다. 가지고있는 구조는 BagBagCommentRelation 사이의 다 대다 관계입니다. 왜 BagCommentRelation이 필요합니까?

편집 : 그것은이처럼 구조를 만드는 것이 가장 쉬운 일이 같은 소리 :

Bag 
    | 
    +-> BagID (Guid) 
    +-> BagNumber (Int) 

BagComment 
    | 
    +-> BagID (Guid) 
    +-> Text (varchar(200)) 

하지만 여러 개체가 일부 복잡성을 참조하기 위해 BagComment (또는 Comment) 테이블을 사용. 그게 당신이해야 할 일이라면, this question가 도움이 될 것입니다.

+0

댓글 테이블에는 다양한 유형의 댓글이 있습니다. 일부 테이블은 Guids를 사용하고 일부 PK는 int를 사용합니다. 또한 하나의 가방에는 많은 의견이있을 수 있습니다. guids 또는 int 중 하나를 고르고 FK가 내 가방 테이블에서 직접 이동해야하는 것처럼 들립니다. – Vaccano

1

귀하의 테이블 BagCommentRelation은 Bag과 BagComments 사이에 n : m 관계를 가지므로 다른 두 테이블에 대한 세부 테이블입니다.

DELETE CASCADE 제약 조건은 세부 테이블에서만 작동하므로 명확하게 Bag을 삭제하면 BagComment를 삭제할 수 없습니다.

가방 설명이 여러 가방에 어떻게 적용될 수 있는지 궁금합니다.

실제로에 다른 Bag 레코드에 사용 된 것과 동일한 BagComment가 있어야하는 경우 관계 테이블에서 더 이상 참조하지 않는 BagComments를 모두 삭제하는 Bag_CommentRelation에 대한 DELETE 트리거를 제안합니다.

+0

댓글은 한 항목 (가방, 사용자가 무엇이든)에만 적용 할 수 있습니다. 우리는 잘못된 테이블 구조를 사용했을 수도 있습니다.관계가 1 대 많은 경우 (bag to comment) 관계가 있다면 BagID에 CommentID가 있고 그 다음에 FK가 bag에서 ​​comment에 이르기까지? (그리고 관계 테이블을 버리십시오.) – Vaccano

+0

@Vaccano 예, BagCommentRelation은 필요하지 않습니다. BagComment에 BagID를 추가하는 것만으로 충분합니다 (Bag에 대한 주석이 두 개 이상 필요한 경우) – devio

1

개인적으로 나는 계단식 삭제를 전혀 사용하지 않을 것입니다. 큰 그룹의 가방에 대한 필요성이 있다면 어떨까요? 캐스케이드 삭제는 몇 시간 동안 테이블을 묶을 수 있습니다. 특별히 필요한 삭제 내용을 작성하는 것이 좋습니다.

관련 문제