ORA_ROWSCN 擬似列
ORA_ROWSCN とは
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 擬似列に関連する内容