2014-07-22 2 views
1

테이블에서 삭제 된 행의 기본 키를 어떻게 든 찾을 수 있습니까?어디에서 삭제 및 업데이트 된 행을 찾아야합니까?

마찬가지로 테이블에서 업데이트 된 행의 기본 키를 찾을 수 있습니까?

  • 시작

나에게 그 두 사이에 삭제 업데이트 된 모든 행의 기본 키를/부여 : 나는 두 개의 타임 스탬프가

:

의 간단한 사용 사례를 살펴 보자 타임 스탬프.

테이블 안에 업데이트 된 정보가 없습니다.

+0

기본 키의 값은 무엇입니까? 그것들이 연속 된 것이라면 처음부터 끝까지 누락 된 기본 키를 찾기 위해 쿼리를 작성할 수 있으며 결과 출력은 삭제 된 행입니다. –

+0

Postgres는 테이블 활동에 대한 정보를 저장하지 않으므로 가장 좋은 방법은 업데이트를 위해 테이블의 행을 업데이트하거나 정보를 업데이트 또는 삭제의 다른 위치에 기록하는 것입니다. – Lucas

답변

3

아니요, PostgreSQL은 내장 된 것과 같은 것을 제공하지 않습니다.

이렇게하려면 대부분의 사람들이 필요로하지 않을 무언가를 추적하고 공간을 낭비해야합니다.

기본 키가 연속적이며 단조로운 경우 generate_series을 통한 왼쪽 반 결합으로 구멍을 찾을 수 있습니다. 그러나 키를 생성하기 위해 serial (즉 시퀀스)을 사용하는 경우이 기능은 작동하지 않습니다. 왜냐하면 모든 롤백은 아무 것도 실제로 삽입되어 삭제되지 않더라도 간격을 생성하기 때문입니다.

추적 할 작업을 별도의 감사 테이블에 기록하려면 감사 트리거를 추가해야합니다. 이것은 소급하여 수행 할 수 없습니다. 이미 과거에 있었던 것을 감사 할 수는 없습니다. 이것은 훨씬 쉬운 옵션입니다.

다른 일반적인 해결책은 행을 테이블에서 실제로 삭제하지 않고 응용 프로그램 수준에서 "삭제됨"으로 플래그하는 것입니다. 예를 들어 테이블에 deleted_atdeleted_by 필드를 설정할 수 있습니다. ON INSERT OR UPDATE OR DELETE DO INSTEAD 트리거가있는보기를 사용하여이 응용 프로그램을 투명하게 만들 수도 있습니다.

개발을 더 쉽게하기 위해 pg_audit 확장 프로그램이 있지만 아직 준비가되지 않았습니다.


세미 관련 측면 노트 : PostgreSQL의 9.5에서 내가 VACUUM는 C 확장을 사용하여, 그것들을 정리하기 전에이 실제로 최근 삭제 된 행에 대한 수있을 것 같아요. 9.5는 커밋의 타임 스탬프를 기록 할 수 있으며, 9.4 이하는 커밋하지 않습니다 (트랜잭션 ID 만 기록합니다). 따라서 어떤 트랜잭션 ID가 xmax을 검사하여 행을 삭제하고 삭제 된 시간 스탬프를 확인할 수 있습니다. 테이블에 "더티 읽기 (dirty read)"를해야하기 때문에 C 확장이 필요합니다.

+0

"기본 키가 인접하고 단조로운 경우 generate_series를 통해 왼쪽 anti-join을 수행 할 수 있습니다."라는 속임수를 사용합니다. 사용 사례는 대상 DB 테이블에서 해당 레코드를 삭제할 수 있도록 원본 DB 테이블에서 삭제 된 행을 확인하는 것이 었습니다. 2 개의 테이블은 사용 사례에 따라 다른 DB 여야하며 대상 DB 테이블의 행은 모두 소스 DB 테이블 행 ID에 대한 역 참조를가집니다. 대안으로 남아있는 모든 소스 ID를 메모리로 가져 오므로 매회 추가 ID를 얻는 것은 중요하지 않습니다. 감사합니다. :-) – aec

1

Netezza을 사용하면 기본 키는 물론 모든 삭제 된 데이터를 가져올 수 있습니다.

먼저 그런 다음 데이터베이스를 조회 삭제 된 기록 set show_deleted_records=true;


을 노출하는 명령을 실행합니다.

Select deletexid,* 
from table_name 
where deletexid>0 

이 트릭은 실수를 되 돌리는 데 유용합니다. 삭제 된 레코드는 reclaim 또는 groom 후에 더 이상 유지되지 않습니다.