Oracle 테이블이 마지막으로 업데이트된 시점을 확인하는 방법

Oracle 데이터베이스의 테이블에서 마지막 INSERT, UPDATE 또는 DELETE 문이 언제 수행되었는지, 수행되었다면 어떻게 수행되었는지 확인할 수 있나요?

약간의 배경 지식이 필요합니다: Oracle 버전은 10g입니다. 정기적으로 실행되는 배치 애플리케이션이 있으며 단일 Oracle 테이블에서 데이터를 읽고 파일에 씁니다. 작업이 마지막으로 실행된 이후 데이터가 변경되지 않았다면 이 작업을 건너뛰고 싶습니다.

이 애플리케이션은 C++로 작성되었으며 OCI를 통해 Oracle과 통신합니다. 이 애플리케이션은 '일반' 사용자로 Oracle에 로그인하므로 특별한 관리자 기능을 사용할 수 없습니다.

편집: '특별한 관리자 기능'은 좋은 설명이 아니었다. 제 말은 테이블에서 SELECT하고 저장 프로시저를 호출하는 것 외에는 아무것도 할 수 없다는 것입니다. 트리거 추가와 같은 데이터베이스 자체에 대한 변경은 안타깝게도 2010 이전에 수행하려는 경우 옵션이 아닙니다.

질문에 대한 의견 (3)

나는'm 정말 늦은 파티에만 여기는's 는 방법을 내가 그것:

SELECT SCN_TO_TIMESTAMP(MAX(ora_rowscn)) from myTable;

It's 을 위해 충분히 가까이 내가 목적이다.

해설 (1)
해결책

기 때문에 10g,당신은 잠재적으로 사용하는ORA_ROWSCN의. 제공하는 당신의 상한 마지막 SCN(시스템은 변화 번호)발생하는 변경에서의 행이 있습니다. 이 때문에 증가하는 순서를 저장할 수 있습 off 최대ORA_ROWSCN는'봤어요 다음에 대해서만 데이터 SCN 보다 크다.

기본적으로ORA_ROWSCN는 실제로 유지되는 블록 수준에서,그렇게 변화하는 모든 행 블록 변경됩니다ORA_ROWSCN모든 행에 대한 블록입니다. 이것은 아마도 아주 충분한 경우에도 최소화 번호의 행 프로세스를 여러 번 변경하지 않으면 우리는'에 대해 이야기 재"정상"데이터 액세스는 패턴이 있습니다. 를 다시 작성할 수 있습니다 테이블을 가진ROWDEPENDENCIES일으키는 원인이 될 것이다ORA_ROWSCN을 추적할 행 수준에서,당신은 더 세부적인 정보만을 필요로 하는 시간의 노력을 다시 테이블.

또 다른 옵션은 것을 구성하는 뭔가가 좋아하는 변경 데이터 캡처(CDC)의 OCI 응용 프로그램에 가입자 변경 테이블,하지만 그 또한 필요로 하는 시간의 노력을 구성하 CDC.

해설 (3)

을 요청하는 DBA 에 대한 감사가 있습니다. 그가 시작할 수 있습니는 감사와 함께 간단한 다음과 같은 명령을 입력하십시오:

AUDIT INSERT ON user.table

할 수 있습니다 다음 테이블을 쿼리자_AUDIT_OBJECT 을 결정하는 경우가 있었는 삽입에 당신의 테이블 때문에 지난 수출합니다.

구글에 대한 오라클의 감사에 대한 더 많은 정보...

해설 (1)
SELECT * FROM all_tab_modifications;
해설 (2)

결과에 대해 일종의 체크섬을 실행하고 이를 로컬에 저장할 수 있나요? 그러면 애플리케이션에서 데이터베이스를 쿼리할 때 체크섬을 비교하여 가져와야 하는지 여부를 결정할 수 있을까요?

ORA_HASH]1 함수를 사용하여 이 작업을 수행할 수 있을 것 같습니다.

업데이트: 또 다른 좋은 리소스입니다: 두 Oracle 테이블의 데이터가 동일한지 확인하는 10g의 ORA_HASH 함수

해설 (3)

Oracle 볼 수 있는 테이블에 대한 변경 내용과 변화가 발생하면 실행할 수 있습의 콜백 함수 PL/SQL 거나 제공합니다. 콜백하는 개체를 가져옵니다's 컬렉션의 테이블이 변경되었는지의 컬렉션이 있 rowid 는 변경하고 동작의 유형은,기능,udp,del.

그래서 당신은 don't 도 테이블에 가서,당신은 당신이 앉아서 호출할 때까지 기다리십시오. You'll 만 가 변경이 있는 경우 쓰기.

It's 는 데이터베이스에 변경을 통지]1. It's 보다 훨씬 간단 CDC 로 저스틴 언급했지만,모두 필요 몇 가지 멋진 관리 물건입니다. 좋은 부분은 어느 쪽의 이러한 변경이 필요합니다.

주의해야 할 점은 CDC 는 정밀한 높은 볼륨에 대한 테이블,DCN 하지 않습니다.

해설 (1)

인 경우 감사를 사용하는 서버에서,단순히 사용

SELECT *
FROM ALL_TAB_MODIFICATIONS
WHERE TABLE_NAME IN ()
해설 (0)

삽입, 업데이트, 삭제 시 다른 테이블의 값을 시스템 날짜로 설정하는 트리거를 추가해야 합니다.

애플리케이션을 실행하면 값을 읽고 어딘가에 저장하여 다음에 실행할 때 비교할 수 있는 참조를 갖도록 합니다.

이를 '특별한 관리자 기능'이라고 생각하시나요?

더 명확한 답변을 얻으려면 실제로 수행하는 작업을 설명하는 것이 좋습니다.

해설 (0)

배치 프로세스가 파일을 작성하는 데 얼마나 걸리나요? 그냥 놔둔 다음 파일을 이전 실행의 파일 사본과 비교하여 동일한지 확인하는 것이 가장 쉬울 수 있습니다.

해설 (1)

는 경우 어느 하나에 대한 대답들을 사용할 수 있다오라클 데이터베이스에 변경을 통지기능과 함께 오는 Oracle10g. 그것은 필요한 변경NOTIFICATION시스템 권한이 있습니다. 등록하실 수 있습 리스너를 트리거 알림 다시 응용 프로그램입니다.

해설 (0)

을 사용하시기 바랍 아래 문의

select * from all_objects ao where ao.OBJECT_TYPE = 'TABLE'  and ao.OWNER = 'YOUR_SCHEMA_NAME'
해설 (2)