Oracle 데이터베이스의 테이블에서 마지막 INSERT, UPDATE 또는 DELETE 문이 언제 수행되었는지, 수행되었다면 어떻게 수행되었는지 확인할 수 있나요?
약간의 배경 지식이 필요합니다: Oracle 버전은 10g입니다. 정기적으로 실행되는 배치 애플리케이션이 있으며 단일 Oracle 테이블에서 데이터를 읽고 파일에 씁니다. 작업이 마지막으로 실행된 이후 데이터가 변경되지 않았다면 이 작업을 건너뛰고 싶습니다.
이 애플리케이션은 C++로 작성되었으며 OCI를 통해 Oracle과 통신합니다. 이 애플리케이션은 '일반' 사용자로 Oracle에 로그인하므로 특별한 관리자 기능을 사용할 수 없습니다.
편집: '특별한 관리자 기능'은 좋은 설명이 아니었다. 제 말은 테이블에서 SELECT하고 저장 프로시저를 호출하는 것 외에는 아무것도 할 수 없다는 것입니다. 트리거 추가와 같은 데이터베이스 자체에 대한 변경은 안타깝게도 2010 이전에 수행하려는 경우 옵션이 아닙니다.
기 때문에 10g,당신은 잠재적으로 사용하는ORA_ROWSCN
의. 제공하는 당신의 상한 마지막 SCN(시스템은 변화 번호)발생하는 변경에서의 행이 있습니다. 이 때문에 증가하는 순서를 저장할 수 있습 off 최대ORA_ROWSCN
는'봤어요 다음에 대해서만 데이터 SCN 보다 크다.
기본적으로ORA_ROWSCN
는 실제로 유지되는 블록 수준에서,그렇게 변화하는 모든 행 블록 변경됩니다ORA_ROWSCN
모든 행에 대한 블록입니다. 이것은 아마도 아주 충분한 경우에도 최소화 번호의 행 프로세스를 여러 번 변경하지 않으면 우리는'에 대해 이야기 재"정상"데이터 액세스는 패턴이 있습니다. 를 다시 작성할 수 있습니다 테이블을 가진ROWDEPENDENCIES
일으키는 원인이 될 것이다ORA_ROWSCN
을 추적할 행 수준에서,당신은 더 세부적인 정보만을 필요로 하는 시간의 노력을 다시 테이블.
또 다른 옵션은 것을 구성하는 뭔가가 좋아하는 변경 데이터 캡처(CDC)의 OCI 응용 프로그램에 가입자 변경 테이블,하지만 그 또한 필요로 하는 시간의 노력을 구성하 CDC.
결과에 대해 일종의 체크섬을 실행하고 이를 로컬에 저장할 수 있나요? 그러면 애플리케이션에서 데이터베이스를 쿼리할 때 체크섬을 비교하여 가져와야 하는지 여부를 결정할 수 있을까요?
ORA_HASH]1 함수를 사용하여 이 작업을 수행할 수 있을 것 같습니다.
업데이트: 또 다른 좋은 리소스입니다: 두 Oracle 테이블의 데이터가 동일한지 확인하는 10g의 ORA_HASH 함수
Oracle 볼 수 있는 테이블에 대한 변경 내용과 변화가 발생하면 실행할 수 있습의 콜백 함수 PL/SQL 거나 제공합니다. 콜백하는 개체를 가져옵니다's 컬렉션의 테이블이 변경되었는지의 컬렉션이 있 rowid 는 변경하고 동작의 유형은,기능,udp,del.
그래서 당신은 don't 도 테이블에 가서,당신은 당신이 앉아서 호출할 때까지 기다리십시오. You'll 만 가 변경이 있는 경우 쓰기.
It's 는 데이터베이스에 변경을 통지]1. It's 보다 훨씬 간단 CDC 로 저스틴 언급했지만,모두 필요 몇 가지 멋진 관리 물건입니다. 좋은 부분은 어느 쪽의 이러한 변경이 필요합니다.
주의해야 할 점은 CDC 는 정밀한 높은 볼륨에 대한 테이블,DCN 하지 않습니다.
을 사용하시기 바랍 아래 문의
select * from all_objects ao where ao.OBJECT_TYPE = 'TABLE' and ao.OWNER = 'YOUR_SCHEMA_NAME'