システム期間テンポラル表の SYSTEM_TIME 期間列は、行のバージョンが現行バージョンとなる期間を示します。
SYSTEM_TIME 期間には、データベース・マネージャーによって生成される値を持つ TIMESTAMP(12) 列の対が含まれています。
列は、適用可能な GENERATED ALWAYS AS オプションによって NOT NULL として定義する必要があります。
期間の開始列は行開始列でなければならず、期間の終了列は行終了列でなければなりません。
CREATE TABLE policy_info
(
policy_id CHAR(4) NOT NULL,
coverage INT NOT NULL,
sys_start TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW BEGIN,
sys_end TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW END,
ts_id TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS TRANSACTION START ID,
PERIOD SYSTEM_TIME (sys_start, sys_end)
) IN policy_space;
- 行開始列
- この列は、行データが現行データになった時刻を表します。
データベース・マネージャーは、行を生成するトランザクションの最初のデータ変更ステートメントの実行時にシステム・クロックを読み取ることによって、この列の値を生成します。
単一の SQL トランザクションの中で複数の行が挿入されるか更新される場合、行開始列の値は、影響を受けるすべての行で同じになります。
これらの行開始列の値は、他のトランザクションの行開始列に対して生成される値とは異なる固有のものです。
行開始列は、SYSTEM_TIME 期間の開始列として必要です。これは、各システム期間テンポラル表で定義する必要があります。
- 既存の REGULAR 表がシステム期間テンポラル表になるように変更されると、行開始列が表に追加されます。
既存の行があれば、その行の行開始列に TIMESTAMP(12) データ・タイプ値のデフォルトの 0001-01-01-00.00.00.000000000000 が取り込まれます。
- 行終了列
- この列は、行データが現行でなくなった時刻を表します。
履歴表の行の場合、行終了列の値は、行が履歴表に追加された時刻を表します。
システム期間テンポラル表の行は定義によって現行となるため、行終了列に TIMESTAMP(12) データ・タイプのデフォルト値 (例えば 9999-12-30-00.00.00.000000000000) が取り込まれます。
行終了列は、SYSTEM_TIME 期間の終了列として必要です。これは、各システム期間テンポラル表で定義する必要があります。
- 既存の REGULAR 表がシステム期間テンポラル表になるように変更されると、行終了列が表に追加されます。
既存の行があれば、その行終了列に TIMESTAMP(12) データ・タイプの値 (デフォルト値: 9999-12-30-00.00.00.000000000000) が取り込まれます。この値は、
異なるタイム・ゾーンの値に変換するときに年が 5 桁になってオーバーフローする可能性を回避するため、
タイム・スタンプの最大可能値よりも意図的に 1 日早くなっています。
行開始列と行終了列は生成列なので、システム期間テンポラル表の終了列の値がその開始列の値より大きくなるようにする SYSTEM_TIME の暗黙チェック制約は生成されません。
チェック制約がないという点は、BUSINESS_TIME に関連してチェック制約が存在するアプリケーション期間テンポラル表と異なる点です。
期間指定を使って表を照会する際、終了列の値が開始列の値より前の日時になっている行を返すことはできません。
終了列の値が開始列の値より後の日時になることを保証する制約を定義することができます。
この保証は、これらの生成列にデータを明示的に入力する操作 (ロード操作など) をサポートしているときに便利です。
システム期間テンポラル表の履歴行が生成されたときに終了列の値が開始列の値より小さい場合に取るアクションを指定するため、systime_period_adj データベース構成パラメーターが使用されます。