ORA_ROWSCN 擬似列

ORA_ROWSCN とは Oracle 10g
Oracle 10g から追加された ROW の システム変更番号(SCN) をあらわす擬似列である。 ただし、デフォルトでは データブロック単位 で同じ SCN を戻す。 つまりブロック単位に作成日時(更新日時)を持っているようなものである。 これをレコード単位に SCN を保存するには、テーブルに ROWDEPENDENCIES 属性を指定する(※)。 これによってレコード毎に SCN を保存することが可能になるが、行単位に SCN の格納領域 (6 バイト) が必要になる。

(※) ROWDEPENDENCIES 句はテーブル作成時にのみ有効 ALTER TABLE では変更できない。 (Oracle 10g 時点)

定義例

CREATE TABLE RIVUS.SCN_TRACE
(
	CREATED_ON	DATE DEFAULT SYSDATE,
	MODIFIED_ON	DATE
)
ROWDEPENDENCIES		-- デフォルトは NOROWDEPENDENCIES
/

(注意) もし、この擬似列をレコードの作成日時や更新日時として代用しようと考えているなら、あまり役に立たないと思われる。(以下の SCN を日付にする方法参照) しかし SCN は COMMIT 単位に発行されるオラクルインスタンスにおける昇順のユニークな番号であるので同一トランザクションのデータを追跡するのには非常に役立つことはあると思われる。
フラッシュバック・クエリーには使用できない。代わりに バージョン問合せ疑似列 が用意されている。(VERSIONS〜 擬似列)

SCN を日付に、日付を SCN に変更する方法

SCN_TO_TIMESTAMP(SCN) と TIMESTAMP_TO_SCN(datetime_value) によって行なう。 この相互変換は SMON_SCN_TIME データディクショナリの内容に基づいて行なわれる。しかし、この データ・ディクショナリ は連続稼動時にして約6日程度の容量しかない。 そのため、例えば一週間前に更新されたレコードの ORA_ROWSCN に SCN_TO_TIMESTAMP を使用すると

 -- 更新後 7日以上放置されたデータを取得
SELECT SCN_TO_TIMESTAMP(ORA_ROWSCN)
  FROM SCN_TRACE
 WHERE MODIFIED_ON <= SYSDATE - 7 ;
 
ORA-08181: 指定された数字は有効なシステム変更番号ではありません

というエラーになる。



ORA_ROWSCN 擬似列に関連する内容

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ 会員制(無料)の公式技術サイト