2017-12-31 128 views
1

Oracle SCNを使用してデータベース内の変更された行を追跡できますか?目標は、特定の表で変更されたすべての行について、x分ごとにデータベースに照会することです。アイデアは変更された行のOracle SCN Keep Trackの使用

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を使用すると、2つのトランザクションT1およびT2が同じ行Rを順番に変更し、 がコミットされた場合、T1 のコミット後に行RのORA_ROWSCNに対する問合せは、コミット後に返された値は T2です。

ブロックが2回クエリされた場合、問合せの間に行が に更新されていなくても、 ORA_ROWSCNの値を変更することができます。 唯一の保証は です。両方のクエリのORA_ROWSCNの値が、その行を最後に変更したトランザクションの コミットSCNよりも大きいことのみが保証されています。

+0

お返事ありがとうございます。 (ROWDEPENDENCIESを使用して)きめ細かいORA_ROWSCNを使用せず、この設定でテーブルを再作成することはできません。 "トランザクションT1がブロックB1に属する行R1を変更し、トランザクションT2がブロックB2に属する行R2を変更し、T2がT1の後に発生すると、 が発生するかどうかは、ブロックレベルでも適用されるかどうかですT1のコミット後のR1のORA_ROWSCNは、T2のコミット後にR2のORA_ROWSCNよりも低いことが保証されています(ファイングレインORA_ROWSCNを使用しないと仮定します)。 –

関連する問題