2012-07-17 4 views
1

테이블 Absence에 PK AbscenceId (철자법 오류가 있음)이 있습니다. 나는 다른 테이블 Note을 가지고 있으며, 에 AbsenceId (이번에는 철자가 맞음)이라는 FK가 있습니다. FK 제약 조건은 다음과 같습니다삭제 트리거가 실행되지 않음

ALTER TABLE [dbo].[Note] WITH CHECK ADD CONSTRAINT [FK_Note_Absence] FOREIGN KEY([AbsenceId]) 
REFERENCES [dbo].[Absence] ([AbscenceId]) 
GO 

Absence이 삭제되면, 나는 모든 Notes 그것으로 가고 싶어. Note은 다른 어떤 것에도 속할 수 있기 때문에 나는 CASCADES으로이 작업을 수행 할 수 없습니다. 결석이 삭제 될 때

그래서 나는 메모를 삭제하는 트리거를 생성 :

ALTER TRIGGER [dbo].[TR_OnAbsenceDelete] ON [dbo].[Absence] 
    FOR DELETE AS 

    DELETE FROM [Note] 
     WHERE AbsenceId IN (SELECT AbscenceId FROM Deleted) 

을하지만이 부착 된 Note이있는 Absence을 삭제하면, 내가 얻을 :

Msg 547, Level 16, State 0, Line 1 
The DELETE statement conflicted with the REFERENCE constraint "FK_Note_Absence". The conflict occurred in database "ReturnToWork", table "dbo.Note", column 'AbsenceId'. 
The statement has been terminated.� 

방아쇠가 처형되지 않는 것과 거의 비슷합니까?

+0

INSTEAD-OF 트리거를 사용해 보셨습니까? 원래 삭제되었거나 삭제 된 레코드도 삭제해야합니다. FK에 이미 삭제 작업이있는 경우에는 사용할 수 없습니다. –

+0

오류 메시지는 꽤 자명하다. 그렇지 않습니까? 'Note'에서 행을 삭제할 수 없으며, 그것을 참조하는 다른 테이블의 행을 정리해야합니다. –

+0

나는 오류를 완전히 이해했다. 나는 방금 전에 트리거를 실행 한 것으로 가정하고 방아쇠가 호출되었다고 확신하지 못했다고 생각한다. – sheamus

답변

3

가 부재에서 첫째 주부터 다음 삭제하는 대신 OF 트리거로 기록 될 시도 할 수 있습니다.

CREATE TRIGGER [dbo].[TR_OnAbsenceDelete] ON [dbo].[Absence] 
    INSTEAD OF DELETE AS 
BEGIN 

    DELETE FROM n 
     FROM deleted d 
      INNER JOIN Note n 
       ON d.AbscenceId = n.AbsenceId 

    DELETE FROM a 
     FROM deleted d 
      INNER JOIN Absence a 
       ON d.AbscenceId = a.AbscenceId 
END 
+0

아무 것도 실패하면 전체 롤백을 받게됩니까? – sheamus

+0

FK 제약 조건에 따라 자동으로 루비 스크립트를 작성했습니다. 위대한 작품, 다른 사람들도 유용하게 사용할 수 있습니다. 나는 그것을 여기에 올렸다. (http://educatedsquirrel.com/2012/07/18/automatically-create-a-cascading-delete-via-triggers/). – sheamus

1

참조 제한으로 인해 실패한 레코드를 삭제하려고하면 문제가 발생합니다. 삭제가 성공하면 삭제 트리거가 호출됩니다. 이 링크에 제안

또한 당신은 당신의 트리거가 필요로하는 대신 How can I fire a trigger BEFORE a delete in T-SQL 2005?

관련 문제