2009-07-23 2 views
0

2 개의 다른 테이블에 하위 레코드가있는 SQL의 행을 복사하려고합니다. 마스터 레코드가 중복되면 모두 복제하려고합니다.SQL- 관련 하위 레코드가있는 레코드 복사

예를 들어, id가 15 인 마스터 레코드를 새 레코드에 복사하려고한다고 가정하면. 나는 모든 자식 레코드를 새로운 마스터 레코드 ID와 함께 복제하기를 원한다. 루프 및 조건을 사용하여 TSQL을 통해이를 수행 할 수 있습니다. 하지만 더 나은 옵션이 있는지 알고 싶습니다.

감사합니다.

답변

1

가장 좋은 방법은 마스터 테이블에서 해당하는 이전 행의 하위를 가져와 하위 테이블에 삽입하는 INSERT 트리거를 사용하는 것입니다.

나는 트리거에서 매우 녹슨 해요,하지만이 같은 : 트리거가 발생했을 때

CREATE TRIGGER tr_master ON master FOR AFTER INSERT AS 
    INSERT INTO childtable(masterid, childvalue) 
     SELECT inserted.id, oldchildren.childvalue 
     FROM inserted INNER JOIN childtable oldchildren 
     ON oldchildren.masterid = inserted.copiedfromid 
    ) 

, 때문에 현재 삽입 한 레코드 (들) 복사 된 마스터 기록 "알고"하지 않습니다 from, 당신은 마스터 테이블의 칼럼에있는 원래 레코드의 프라이 머리 키를 추적 할 필요가있을 것이다 (나는 여기에서 "copiedfromid"로 레이블을 붙였다).

"삽입 됨"은 해당 트랜잭션에서 마스터 테이블에 삽입되는 모든 행을 포함하는 트리거 내에서 사용 가능한 특수 테이블입니다. 자식 테이블의 외래 키가 마스터 테이블과 참조 무결성을 적용한다고 가정하기 때문에 "INSERT 후에"대신 "FOR INSTER INSERT"를 사용했습니다. 삽입이 실제로 발생한 후에 만 ​​트리거해야한다고 생각합니다. .

+0

이 트리거는 어디에서 "oldchildren"정보를 가져 옵니까? –

+0

내가 명료하게하기 위해 "노인"으로 앨리어스 처리 한 하위 테이블에서. "copiedfromid"ID에 속한 하위 항목을 찾고 새로운 복사 된 각 레코드를 제공해야합니다. – richardtallent

+0

잘 삽입하면 새로운 삽입물인지 복사 과정인지 알 수 있습니다. 새로운 인서트를하면 트리거가 올바르게 실행됩니다. – Aneef

1

편집 OP의 요구 사항에보다 잘 부합하도록 변경되었습니다.

한 번에 하나의 마스터 레코드 만 복사하는 경우. 그런 다음 저장 프로 시저를 사용하여 마스터와 하위를 복사합니다. 저장된 제품에 오류 처리 및 트랜잭션 제어를 포함하십시오. 복사 코드는 다음과 같은 삽입 명령문입니다.

declare @NewMasterId int -- or the appropriate type. 
    insert into MasterCopy (column names ...) 
    select column names .. 
    from Master 
    where MasterId = @MasterId 
    set @NewMasterId = scope_identity 

    insert into ChildCopyA (MasterId, column names ...) 
    select @NewMasterId, column names ... 
    from ChildA 
    where MasterId = @MasterId -- FK to master table. 

    insert into ChildCopyB (MasterId, column names ...) 
    select @NewMasterId, column names ... 
    from ChildB 
    where MasterId = @MasterId -- FK to master table. 
+0

이것은 작동하지 않습니다 ... OP는 마스터 테이블의 복사본이 아닌 마스터 테이블에 다시 삽입하려고합니다. 따라서 중복 마스터 레코드를 삽입 할 때 마스터 ID는 원래 마스터 ID와 다릅니다. @Richardtallet. – richardtallent

+0

질문을 잘못 읽었습니다. –

관련 문제