2009-09-28 2 views
5

나는 적어도 우주에 대한 SQL 마스터가 아니기 때문에 나는 적어도 내가 원하는 바램의 퍼즐을 가지고있다.SQL 서버에서 데이터베이스 커서 피하기

표 A 표 B와 표 C.이

표 C 표 A에 FK를 가지고 표 B,에 FK (Foriegn 키)를 갖는다 (이들 각각은 다수된다 : 기본적으로 I 세 테이블이 to one)

표 A에서 항목을 제거해야하며 모든 항목은 표 B와 C에서 해당 항목을 제외해야합니다. 이전에는 커서를 사용하여 표 B의 항목을 모두 선택했습니다 표 C에서 해당 항목을 모두 삭제하기 위해 각 항목을 순환시킵니다. 이제이 기능이 작동하고 잘 작동하지만 커서를 사용하지 않고도이 효과를 얻을 수있는 더 나은 방법이 있다고 생각합니다. 그래서 제 질문입니다 - 어떻게 커서를 사용하지 않고 이것을 할 수 있습니까, 아니면 할 수 있습니까?

(명확하지 않은 경우 알려주세요. 질문을 수정하려고합니다.)

답변

11

당신이 ON 지정 CASCADE를 삭제할 수 있습니다 모두 테이블에 대한 외래 키 관계를 만들 때 ON DELETE CASCADE

+3

@ OP- 이것은 참조 된 레코드가 테이블 A에서 삭제 될 때 테이블 B 및 C의 레코드를 삭제합니다 –

2

FOREIGN KEY의를 선언하고 A에 기록을 삭제할 때 그것은 당신이 알아서 할 것이다

8

당신은

  • 당신은 당신의 외래 키에 cascading deletes를 사용할 수 있습니다 ...이 두 가지 방법으로 할 수 있습니다.

    CREATE TABLE TableB 
        (FKColumn INT, 
        CONSTRAINT MyFk FOREIGN KEY (FKColumn) 
         REFERENCES TableA(PKColumn) ON DELETE CASCADE) 
    
    • 당신은 관련 기록을 삭제하는 각 테이블에 트리거를 삭제 사용할 수
  • .
    • CREATE TRIGGER cascade_triggerA 
          ON TableA 
          FOR DELETE 
      AS 
      BEGIN 
      
          DELETE TableB 
          FROM TableB JOIN DELETED ON TableB.FKColumn = DELETED.PKColumn 
      
      END 
      
      CREATE TRIGGER cascade_triggerB 
          ON TableB 
          FOR DELETE 
      AS 
      BEGIN 
      
          DELETE TableC 
          FROM TableC JOIN DELETED ON TableC.FKColumn = DELETED.PKColumn 
      
      END 
      
      당신은 MS SQL 서버를 사용하는 경우

    , 당신은 또한 INSTEAD OF DELETE 트리거를 사용할 수 있습니다. 이 경우 TableA에 방아쇠를 만들고 방아쇠에 모든 논리를 붙여 세 개의 모든 테이블에서 레코드를 삭제합니다.

위의 경우에는 테이블 A에서 레코드를 삭제하고 계단식 및 트리거로 나머지 부분을 처리하도록합니다.

5

이미 제공된 답변 (계단식 삭제 및 트리거)은 훌륭하지만 이러한 옵션이없는 환경에서 작업 할 수도 있습니다. 그렇다면 아래는 순전히 SQL 솔루션입니다. 이 예제는 DELETE 구문과 관련이 있습니다. 현실 세계에서는 트랜잭션 내에서이를 랩핑하고 스토어드 프로 시저로 구현할 수 있습니다.

-- 
DECLARE @Param_PK_TableA int 
SET  @Param_PK_TableA = 1500 


------------------------------- 
-- TABLE C -------------------- 
DELETE TableC 

FROM TableC 

    INNER JOIN TableB 
      ON TableB.TableB_ID = TableC.TableB_ID 

    INNER JOIN TableA 
      ON TableA.TableA_ID = TableB.TableA_ID 

WHERE 
    (TableA.TableA_ID = @Param_PK_TableA) 



------------------------------- 
-- TABLE B -------------------- 
DELETE TableB 

FROM TableB 

    INNER JOIN TableA 
      ON TableA.TableA_ID = TableB.TableA_ID 

WHERE 
    (TableA.TableA_ID = @Param_PK_TableA) 



------------------------------- 
-- TABLE A -------------------- 
DELETE TableA 

WHERE 
    (TableA.TableA_ID = @Param_PK_TableA)