복붙노트

[SQL] SQL 서버 : 대신 DELETE CASCADE ON의 자기 참조 FK, 트리거

SQL

SQL 서버 : 대신 DELETE CASCADE ON의 자기 참조 FK, 트리거

나는 다음과 같은 columls을 가지고 내 이름의 테이블 CATEGORY에 온 DELETE CASCADE를 수행 할 필요가 CAT_ID (BIGINT) NAME (VARCHAR) PARENT_CAT_ID (BIGINT)

PARENT_CAT_ID는 CAT_ID에 FK이다. 물론, 아름다운 SQL 서버 나 삭제에 원형 또는 여러 경로를 주장 DELETE CASCADE ON 사용하지 않습니다.

나는 종종 제안을 참조하는 솔루션은 트리거입니다. 나는 다음과 같은 트리거를 만들어 :

USE [ma]
GO
/****** Object:  Trigger [dbo].[TRG_DELETE_CHILD_CATEGORIES]    Script Date: 11/23/2009 16:47:59 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[TRG_DELETE_CHILD_CATEGORIES] ON [dbo].[CATEGORY] FOR DELETE AS
SET NOCOUNT ON
/* * CASCADE DELETES TO '[Tbl B]' */
DELETE CATEGORY FROM deleted, CATEGORY WHERE deleted.CAT_ID = CATEGORY.PARENT_CAT_ID

내가 수동으로 아이의 범주와 범주를 삭제하면, 나는 다음과 같은 예외가 :

내 트리거가 잘못 어떤 생각?

최신 정보: 죄송 편집을 위해,하지만 난 다른 테이블 CAT_SCH.ID의 FK 또 다른 열 CATEGORY.CAT_SCH_ID을 보유하고 있습니다. 이 FK은 CASCADE가 나는 CAT_SCH을 삭제하면 해당 카테고리도 삭제해야한다는 의미뿐만 아니라, DELETE있다. 나는 트리거를 정의 할 때, 나는이 오류가 발생합니다 :

삭제 대신 또는 그 대신 테이블 '범주'에 UPDATE 트리거 'TRG_DEL_CATEGORY_WITH_CHILDREN'을 만들 수 없습니다. 테이블이 DELETE 또는 UPDATE 계단식와 외부 키를 가지고 있기 때문이다.

어떤 아이디어?

해결법

  1. ==============================

    1.일본어 DELETE를 실행 한 후 FOR DELETE 트리거가 발생된다. 반복적으로 삭제하려면 대신 DELETE 트리거의 작성해야합니다.

    일본어 DELETE를 실행 한 후 FOR DELETE 트리거가 발생된다. 반복적으로 삭제하려면 대신 DELETE 트리거의 작성해야합니다.

    이 알고리즘은 다음과 같이이다 :

    임시 테이블과 결합하여 테이블에서 DELETE 기록.

    내 블로그에 재귀 삭제를 설명했다.

    최신 정보

    난 그냥 카테고리에 재귀 외래 키에서 DELETE CASCADE 플래그가 드롭해야 할 것 같아요. CAT_SCH에서 외래 키에 CASCADE 플래그는 문제가 안된다.

  2. from https://stackoverflow.com/questions/1783700/sql-server-self-reference-fk-trigger-instead-of-on-delete-cascade by cc-by-sa and MIT license