2011-04-05 9 views
2

데이터웨어 하우스를 제공 할 대용량 데이터 복제 서비스를 만드는 작업이 있습니다. 소스 데이터베이스는 다른 서버에 상주합니다.삭제 삭제 삭제 된 레코드를 추적하기위한 트리거

지금까지 SqlBulkCopy 클래스와 TSql Excepts 문을 함께 사용하여웨어 하우스에 업데이트 및 삽입 항목을 구현할 수있었습니다.

내 문제는 이제 레코드 삭제를 처리하고 있습니다. 삭제 처리를 위해 생각할 수있는 유일한 방법은 테이블에 사용자 지정 트리거를 만들고 삭제 된 레코드를 내 서비스에서 읽을 수있는 임시 테이블에 삽입하고웨어 하우스에서 제거하는 것입니다.

많은 데이터 복제 도구가 있지만 회사에서 자체 서비스를 원하는 경우를 알고 있습니다.

참고 제공 될 테이블 중 일부는 1 억 개가 넘습니다.

제안 사항?

+1

일단 삭제하면 'DELETED'비트 열을 '1'로 표시하는 "소프트 삭제"를 할 수없는 이유는 무엇입니까? – JNK

+0

오, 좋겠어! 이러한 원본 데이터베이스 시스템은 타사 공급 업체가 실제로 개발했습니다. 우리는 항상 이러한 공급 업체로부터 업데이트를받으며 업데이트시 전체 스키마를 삭제할 수 있습니다. –

답변

2

삭제 트리거가 그다지 좋지 않을 것이라고 생각합니다. 1 억 개의 레코드가 확실히 좋은 덩어리이지만 SQL이 실행 경로를 최적화 할 수있는 방식으로 서버에서 트리거를 실행하고 있습니다.

클라이언트 측에서 다른 작업을 수행하는 경우 서버에서 레코드를 가져온 다음웨어 하우스에 delete 명령을 실행하면 오버 헤드가 발생합니다.

방아쇠가 무엇입니까?

+0

아주 좋은 질문입니다. 이러한 원본 데이터베이스는 타사 공급 업체에서 설치했습니다. 누군가가 방아쇠 기술의 대안을 생각해 낸다면 궁금합니다. –

1

내가 읽고있는 바로는 복제를 다시 작성하려고합니다 (http://msdn.microsoft.com/en-us/library/ms151198.aspx). 요약 해 보셨습니까? 그렇다면 내 제안은 그렇지 않을 것입니다.

+0

당신이 옳습니다. Oracle 데이터베이스와 SQL Server 데이터베이스간에 복제 할 수 있습니까? "SQL 서버 복제를위한 인형"링크/책을 제안 해 주시겠습니까? –

+0

Oracle과 SQL Server간에 복제를 수행 할 수 있습니다 (개인적으로 경험이 없지만). 제가 시작했다면 필자가 제공 한 링크 (SQL 온라인 설명서로 이동)를보고 무엇이 있는지 볼 것입니다. 나의 유일한 충고는 길을 따라 불쾌한 뒤틀림과 뒤틀림이 있기 때문에 간단하게 시작하는 것입니다. –

0

내가하는 일을 완전히 이해하지 못했지만 SQL Server에서 output clause으로 삭제 된 행을 캡처 할 수 있습니다. 아마도 이것은 당신이 사용할 수있는 것입니다.

-- Table to delete from 
declare @T table (id int, name varchar(50)) 

-- Table to capture the deleted rows 
declare @DeletedRows table (id int, name varchar(50)) 

-- Dummy data 
insert into @T values 
(1, 'Name1'), 
(2, 'Name2'), 
(3, 'Name3'), 
(4, 'Name4'), 
(5, 'Name5') 

-- Delete every other row 
delete from @T 
output deleted.id, deleted.name into @DeletedRows 
where id % 2 = 0 

select * 
from @DeletedRows 

결과 - 삭제 된 행

id   name 
----------- -------------------------------------------------- 
2   Name2 
4   Name4 
+0

thats 깔끔합니다. 전에는 그렇게하지 않았어. 불행히도 시나리오는 제 3 자 공급 업체가 개발 했으므로 소스 데이터베이스를 변경하지 않으려 고합니다. 귀하의 게시물 주셔서 감사합니다! –

+0

@ N8 - 확인. 그래서 당신은 삭제를 통제하는 사람이 아닙니다. 벤더 코드에서 삭제가 발생했을 때이를 포착하고이를 추적하고 싶습니까? –

+0

일종의 데이터웨어 하우스를 제공하는 몇 가지 맞춤 코드가 있습니다. 타사 응용 프로그램 데이터베이스를 직접 타격 한 다음 일부 추가 논리를 사용하여 타사 시스템의 아티팩트에 데이터웨어 하우스 내의 다른 시스템 데이터에 조인하는 데 사용할 수있는웨어 하우스 키를 제공합니다. –

1

SQL 서버가 내장되어 변경 내용 추적 (적어도 2008 R2에서,이 기능이 도입되었을 때 정확하게 확실하지 않다). 더 많은 것을 읽으십시오 : http://msdn.microsoft.com/en-us/library/cc280462.aspx

+0

굉장해! 나는 한번 보겠습니다! –

+0

shucks, 정말 멋지 네요. 불행히도 SQL Server 2008에서만 작동하는 것처럼 보입니다. Oracle Server와 SQL Server 2005 서버가 있어야 작동 할 수 있습니다. 재미있는 정보를 가져 주셔서 감사합니다! –

0

나는 기록 표 ID를 스테이징 테이블에 삽입하는 데 좋은 경험을했습니다. 그런 다음 SSIS 패키지 집합을 만들고 SQL 에이전트 작업은 준비 테이블을 폴링하고 준비 테이블의 내용을 기반으로 적절한 작업을 수행합니다. 이로 인해 사용자 지정을 구현할 수있었습니다. 우리는 OLTP 시스템과 창고 사이에서 데이터를 이동했기 때문에 많은 의미를가집니다. 레코드가 행에 대해 항상 일렬로 정렬되는 것은 아닙니다.