2017-12-31 127 views
1

데이터베이스에서 수정 된 행을 추적하기 위해 Oracle SCN을 사용할 수 있습니까? 목표는 특정 테이블에서 수정 된 모든 행에 대해 x 분마다 데이터베이스를 쿼리하는 것입니다. 아이디어는수정 된 행의 Oracle SCN 보관 트랙 사용

SELECT current_scn FROM V$DATABASE; 

를 사용하여 현재 SCN을 기억 한 후 X 분 후 난 그냥 그 이후로 변경된 모든 행을 얻을

SELECT * from mytable where ORA_ROWSCN > current_scn_x_minutes_ago; 

같은 쿼리를 실행하는 것 (그리고 따라서이 높은 SCN). SCN이 블록 단위로 관리되기 때문에 쿼리가 너무 많은 결과를 반환한다는 것을 알고 있지만 이것은 중요하지 않습니다. 내가 가진 주요 질문은 SCN이 엄격하게 증가하는지 여부, 즉 다음 생성 된 SCN이 항상 현재 SCN (V $ DATABASE에서 쿼리 됨)보다 높은지 아니면 SCN_TO_TIMESTAMP 함수를 사용하여 순서가 맞는지 여부입니다. 옳은.

답변

3

SCN을 엄격하게 다음 생성 SCN이 문서에 따르면 현재 SCN

항상보다 높은 여부, 즉, 증가 여부를 내가 가진 주요 질문은 : ORA_ROWSCN Pseudocolumn

블록 수준이든 행 수준이든간에 ORA_ROWSCN은 이 정확한 SCN으로 간주되어서는 안됩니다. 예를 들어 트랜잭션 이 블록에서 행 R을 변경하고 SCN 10에서 커밋 된 경우 행의 ORA_ROWSCN이 10을 반환한다는 것은 항상 이 아닙니다. 값이 보다 작 으면 절대 반환되지 않지만 더 큰 값은 반환되지 않습니다. ~ 10이 리턴 될 수 있습니다. 즉, 행의 ORA_ROWSCN은 이 마지막으로 해당 행을 수정 한 트랜잭션의 정확한 커밋 SCN이되도록 항상 보장되지 않습니다. 그러나 세분화 된 ORA_ROWSCN을 사용하면 두 개의트랜잭션 T1 및 T2가 동일한 행 R을 차례로 수정하고 이 커밋 된 경우 T1 커밋 후 행 R의 ORA_ROWSCN에 대한 쿼리는 커밋 후에 반환 된 값은 T2입니다. 블록 두번 질의 경우

는, 다음 행이 상기 질의 사이의 시간에 업데이트되지 않은 경우에도 쿼리 사이에서 변경 ORA_ROWSCN의 값이 가능하다. 두 쿼리의 ORA_ROWSCN 값이 해당 행을 마지막으로 수정 한 트랜잭션의 커밋 SCN보다 크다는 유일한 보장이 입니다.

+0

답해 주셔서 감사합니다. 우리는 ROWDEPENDENCIES를 사용하여 세분화 된 ORA_ROWSCN을 사용하지 않으며이 설정으로 테이블을 다시 생성 할 수 없습니다. 따라서 위에서 언급 한 규칙이 블록 수준에도 적용되는지 또는 다시 말하면되는지 여부는 다음과 같습니다. "트랜잭션 T1이 블록 B1에 속하는 행 R1을 수정하고 트랜잭션 T2가 블록 B2에 속한 행 R2를 수정하고 T2 후에 T1이 발생하면 T1의 커밋이 T2의 커밋 후에 R2의 ORA_ROWSCN보다 낮을 것을 보장 한 후에 R1의 ORA_ROWSCN (우리가 세분화 된 ORA_ROWSCN을 사용하지 않는다고 가정)은 무엇입니까? " –