2014-07-06 4 views
0

ID 및 ParentID에 대한 외래 키 제약 조건을 가진 재귀 관계가있는 테이블이 있습니다.SQL Server 저장 프로 시저 DELETE

MyTable Schema 
------------------ 
ID 
Name 
ParentID 

나는 외래 키 제약 조건을 적용하고 (내가 원하는이다) 순환 폭포의 원인이 때문에 없음 작업에 계단식을 떠날 필요가 아니에요. 자녀가있는 레코드를 삭제할 때 여전히 모든 하위 항목을 자동으로 삭제하려고합니다 (예 : MyTable에서 삭제 ParentID = THIS_RECORD_I_JUST_DELETED). 이것은 모든 자식과 자식이 삭제 될 때까지 재귀 적으로 프로 시저를 호출합니다.

어떻게 이렇게 SQL Server 프로 시저를 작성할 수 있습니까? 나는 ON UPDATING 또는 ON DELETING 타입 조항이 있음을 알고 있지만, Google을 사용하면 관련 항목을 찾을 수 없습니다.

+1

사이 클릭 캐스케이드는 위험합니다. 나는 일반적으로 그들을 피한다. –

+0

개인적으로, 나는 계층 적 업데이트를 위해 sp 또는 트리거에 의존하는 데이터베이스를 설계하지 않습니다. –

답변

0

다음 쿼리를 사용하십시오.

이 쿼리에서는 먼저 삭제해야하는 모든 행을 선택했습니다. 그런 다음 parentId 열을 업데이트 한 다음 삭제하십시오.

CREATE PROCEDURE DeleteRow(@Id INT) 
AS BEGIN 
    DECLARE @IdList TABLE(Id int) 

    ;WITH IdList(Id) AS (
     SELECT Id 
     FROM YourTable t 
     WHERE Id = @Id 

     UNION ALL 

     SELECT t.Id 
     FROM IdList 
     INNER JOIN YourTable t ON t.ParentId = IdList.Id 
    ) 

    BEGIN TRANSACTION 
    UPDATE YourTable 
    SET parentId = NULL 
    OUTPUT Inserted.Id INTO @IdList 
    WHERE Id IN(SELECT Id FROM IdList) 

    DELETE YourTable WHERE Id IN (SELECT Id FROM @IdList) 
    COMMIT TRANSACTION 
END