2010-02-01 3 views
2

이전에는 각 테이블에 필드를 추가하고 모든 업데이트/삽입에서 GETDATE()를 사용하여 필드를 업데이트했습니다. 문제는 이제 삭제를 추적해야합니다. 나는 테이블이 변경 될 때마다 업데이트하고 모든 다른 테이블에 트리거를 추가하는 것을 생각하고있었습니다. 아이디어 ??? 감사!테이블에서 SQL을 업데이트 할 때를 추적하는 가장 좋은 방법은 무엇입니까?

+1

어떤 SQL Server 버전을 사용하고 있습니까? SQL 2008은 사용하기에 충분할 정도로 운이 좋을지도 모르는 심각한 변경 추적 기능을 도입했습니다. - '변경 추적'및 '변경 데이터 캡처'를 검색합니다 (IIRC). –

+0

아직도 2005 년 ... – Mike

답변

4

원본 테이블의 변경 사항에 대한 모든 내용을 추적 할 수있는 기록 테이블 (원본 테이블과 동일한 열과 자동 증분 ID 열이있는 테이블)이있는 경우 삽입, 삭제 및 모든 변경 사항을 추적 할 수 있습니다. 삽입, 갱신 W h 제에 대한 트리거를 사용하여 행을 히스토리 테이블에 넣으십시오. 이러한 모든 옵션이 필요하지 않은 경우 필요한 옵션을 사용하십시오.

원본 테이블에서 IsDeleted 플래그를 사용하면 모든 쿼리가 복잡해지며 활성 테이블에 많은 불필요한 행이 남습니다. 그러나 그것은 당신의 필요에 따라 작동 할 수 있습니다.

+0

@aaaa bbbb - 일부 지역에서는 데이터를 잃어 버렸을 가능성을 다시 확인해야합니다. 이 정보는 백업 한 다음 매주 삭제할 수 있습니다. 특히 비트 유형의 추가 필드는 매우 미미합니다. – JonH

+0

@JonH - 비트 필드가 합리적 일 수 있다는 데 동의합니다. 히스토리 테이블 접근법을 사용하면 변경 사항을보다 잘 추적 할 수 있습니다. 또한 히스토리 테이블 접근법은 즉시 활성 테이블에서 삭제 된 데이터를 가져옵니다. –

+0

이로 인해 오버 헤드가 발생하며 대용량 데이터로드를 비활성화 할 수 있습니다. – Sam

0

레코드를 삭제됨 = 1로 플래그를 지정하고 삭제하지 않습니다. 삭제 대신 트리거를 업데이트하십시오 ...

1

비트 필드가 IsDeleted로 설계된 테이블을 보았고 기본값은 물론 false로 설정되었습니다. 항목이 삭제되면이 값은 true로 설정됩니다. 그러면 모든 쿼리가 다음을 수행해야합니다.

SELECT blah FROM myTable WHERE IsDeleted=0 

이렇게하면 실수로 행을 삭제 한 경우 다시 가져올 수 있습니다. 또한 매주/매월/매년 기준으로 기록을 삭제할 수 있습니다.

그것은 단지 당신을위한 아이디어입니다.

+0

많은 DB도 다소 비슷한 효과적인 날짜 개념을 사용합니다. – Sam

0

이름에 표준화 된 접두사가 추가 된 복제 테이블을 보았습니다. 삭제 된 모든 행은 복제 테이블로 이동됩니다. 이렇게하면 원본 테이블의 행을 무시하지 않고 유지하는 오버 헤드가 제거됩니다.

0

모든 작업 (insert - update - delete)은 저널링 테이블에 기록되어야합니다. 나는 항상 행동, 타임 스탬프, 행동을 유발 한 사용자를 기록한다. 원본 테이블에 Isdelete 열을 추가하는 것은 좋지 않습니다.

+1

@Chris - 전혀 나쁜 습관이 아닙니다.일부 회사에서는 이와 같은 디자인을 요구하며 저널링 테이블에는 문제가 없습니다. 그러나 사람들이 IsDeleted 열을 추가한다고 말하는 것은 나쁜 습관 그 자체입니다. – JonH

+0

그럼 다시 말해 보겠습니다. 원래 테이블 내부 IsDeleted 열 사용에 대한 조언. 두 가지 이유로 : 다른 포스터에서 지적한 바와 같이. 그것은 당신의 질문을 복잡하게합니다. 또는 더 나쁜 것은 삭제 된 데이터를 사용자에게 표시하여이 열을 필터링하는 것을 잊어 버린 것일 수 있습니다. 둘째, 저는 항상 DB 설계에서 기능 및 기술 데이터를 분리하려고합니다. 나는 이것을 하나의 테이블에 혼합하는 것이 좋은 생각이라고 생각하지 않는다. – Chris

+0

세 번째 이유를 언급하는 것을 잊어 버렸습니다. 원래 테이블에 'Isdeleted'레코드를 저장하면 이후에 성능 문제가 될 수 있습니다 (레코드 수, 삭제 된 레코드 수에 따라 다름). 별도의 테이블에 보관하면 필요할 때만 쿼리 할 수 ​​있습니다. – Chris

관련 문제