2012-04-05 4 views
0

두 번째 SQL Server 인스턴스에 프로덕션 데이터베이스와 보관 데이터베이스가 있습니다.프로덕션 데이터베이스 보관 SQL Server 2008 삽입/업데이트

프로덕션 데이터베이스에 데이터를 삽입하거나 업데이트 (삭제하지 않음) 할 때 동일한 데이터를 아카이브 데이터베이스에 삽입하거나 업데이트해야합니다.

어떻게해야할까요?

감사

+0

보관 파일 DB에 트리거를 작성하십시오. 데이터베이스 파일에 많은 트랜잭션이있을 경우 – Teja

+0

@Vutukuri 어떻게 처리합니까? 적절한 해결책이 될까요? – rvphx

답변

1

가 같은 DB 인스턴스에있는 경우, 트리거가 테이블의 많은 아니라 가정 사소한 것입니다.

크기가 커지면 SQL Server 복제를 조사하는 것이 좋습니다. Microsoft는 올바른 작업을 수행하는 데 많은 시간과 돈을 투자했습니다.

+0

데이터베이스에서 데이터를 삭제하지 않으려면 프로덕션 db에서 프로덕션 데이터베이스를 제거하십시오. 복제 작업을 수행 할 수 있습니까? – Maxime

+0

수정하십시오. 1 방향 복제, 생산 -> 보관을 설정할 수 있습니다. 아카이브 데이터에 대한 변경 사항은 Production에 영향을 미치지 않습니다. –

+0

프로덕션 DB에서 항목을 삭제하면이 항목을 아카이브에 보관해야합니다. 프로덕션 db에있는 모든 테이블의 데이터는 매일 시작될 때 삭제됩니다 ... 그렇게 할 수 있습니까? – Maxime

0

트리거를 사용하려는 경우 프로덕션 데이터베이스의로드 크기를 고려해야 할 수 있습니다. 매우 집중적 인 데이터베이스 인 경우 복제 또는 미러링 또는 로그 전달과 같은 고 가용성 솔루션을 사용하는 것이 좋습니다. 필요에 따라 솔루션 중 하나가 적합 할 수 있습니다. 동시에, 구현하는 것에 따라 변경해야하는 "콜드"복구 솔루션을 고려해야합니다.

0

복제는 삭제 내용도 복제합니다. 그러나 아카이브 데이터베이스에서 h 제를 h 제하지 않으면 프로덕션 데이터베이스에서는 값이 유효하지만 값이이 L 존재하기 때.에 아카이브 데이터베이스에서는 유효하지 않은 고유 인덱스의 행에서. 제 점이 _ 생할 수 있습니다. 당신의 디자인이 문제가되지 않는 것을 의미한다면, 생산 테이블에 간단한 트리거는 당신을 위해이 작업을 수행합니다

CREATE TRIGGER TR_MyTable_ToArchive ON MyTable FOR INSERT, UPDATE AS 
BEGIN 
    SET ROW_COUNT OFF 
    -- First inserts 
    SET IDENTITY_INSERT ArchiveDB..MyTable ON -- Only if identity column is used 
    INSERT INTO ArchiveDB..MyTable(MyTableKey, Col1, Col2, Col3, ...) 
    SELECT MyTableKey, Col1, Col2, Col3, ... 
    FROM inserted i LEFT JOIN deleted d ON i.MyTableKey = d.MyTableKey 
    WHERE d.MyTableKey IS NULL 
    SET IDENTITY_INSERT ArchiveDB..MyTable OFF -- Only if identity column is used 

    -- then updates 
    UPDATE t SET Col1 = i.col1, col2 = i.col2, col3 = i.col3, ... 
    FROM ArchiveDB..MyTable t INNER JOIN inserted i ON t.MyTableKey = i.MyTableKey 
     INNER JOIN deleted d ON i.MyTableKey = d.MyTableKey 
END 

이것은 아카이브 데이터베이스 프로덕션 데이터베이스와 동일한 서버에있는 것으로 가정합니다. 그렇지 않은 경우 연결된 서버 항목을 만든 다음 ArchiveDB..MyTableArchiveServer.ArchiveDB..MyTable으로 바꿔야합니다. 여기서 ArchiveServer은 연결된 서버의 이름입니다.

그러나 프로덕션 데이터베이스에 이미 많은로드가있는 경우 두 배로 증가한다는 점에 유의하십시오. 이것을 피하기 위해 각 테이블에 업데이트 플래그 필드를 추가하고 데이터베이스로드가 최소 일 때 (예 : 오전 1시) 예약 된 작업을 실행할 수 있습니다. 그런 다음 트리거는 필드를 삽입의 경우 I 또는 프로덕션 데이터베이스의 업데이트의 경우 U으로 설정하고 예약 된 작업은이 필드의 값에 따라 아카이브 데이터베이스에서 업데이트 또는 삽입 한 다음 필드를 재설정합니다 완료되면 NULL으로 변경하십시오.

관련 문제