current更新は、現在の時刻で有効な行のみに作用します。このような行は、更新時点での現在の時刻と重なるPVを含むvalid-timeテーブルまたは二重テンポラル テーブルの行であり、TEMPORAL_TIMESTAMP(valid-time列のタイプによっては、TEMPORAL_DATE)から始まるか、それを含むvalid-time期間を含む行になります。
UPDATE文に追加の検索条件を指定すると、その条件は上記の現在行に適用されます。検索条件には、valid-time列とtransaction-time列の両方を対象にした条件を指定できます。
- valid-timeテーブルまたは二重テンポラル テーブルで、現在の時刻以前に終了するPVを含む行。このような行は、有効時間で履歴行になるので、current更新の対象にはなりません。
- valid-timeテーブルまたは二重テンポラル テーブルで、現在の時刻より後に開始するPVを含む行。このような行は、有効時間で将来行になるので、current更新の対象にはなりません。
- 二重テンポラル テーブルで、UNTIL_CLOSED (9999-12-31 23:59:59.999999+00:00)より前に終了するtransaction-time期間を含む行。このような行は、トランザクション時間でクローズされたと見なされ、ほとんどのSQLで使用することはできません。これらの行は、変更の自動的な内部履歴の一部であり、トランザクション時間を含むテーブルに対してデータベースによって保守されるものなので、current更新の対象にはなりません。
行に対するcurrent更新の結果として、0行、1行または2行の追加の行がデータベースに追加されることになります。この追加の行数は、対象行のPVと現在の時刻とのリレーションシップと、テーブルがvalid-timeテーブルであるか、二重テンポラル テーブルであるかに応じて異なります。
valid-timeテーブルの対象行へのCurrent更新
- 元の行のvalid-time期間は、更新の時刻(valid-time列のタイプに応じて、TEMPORAL_TIMESTAMPまたはTEMPORAL_DATE)に終了するように設定されます。その他の列値は変更されません。
つまり、元の行は非有効になったということです。この行は履歴行になり、更新前に有効だった元の列値を示します。
- 更新した列に新しい値を保持する元の行のコピーが挿入されます。この行のvalid-time期間は、更新の時刻に開始し、元の行と同じ時刻に終了するように設定されます。
- current更新操作により、行が更新されます。
current更新のPAは更新時点でのTEMPORAL_TIMESTAMPから始まり、将来に行が変更または削除される不確定の時刻UNTIL_CHANGEDに終了します。このPAは対象行のPVと一致するかPVを収容するため、行のPV全体で変更が有効になります。変更の前後に存在した行状態を説明するために、新しい行をデータベースに追加する必要はありません。
二重テンポラル テーブルの対象行へのCurrent更新
二重テンポラル テーブルには、transaction-time列とvalid-time列の両方の列が含まれます。二重テンポラル テーブルに対するcurrent更新操作の結果は、valid-time列についてはvalid-timeテーブルに対する結果と同じです。transaction-time列が存在することから、current更新の結果として行が変更される度に、データベースには次に示すように追加の行が生成されます。これは、変更前の行のスナップショットを作成して、トランザクション時間で変更を追跡するためのものです。
- 元の行のtransaction-time期間が更新時(TT_TIMESTAMP)に終了するように設定され、transaction-time次元で閉じられるように行にマークが付けられます。行の他の値は変更されません。
これにより、元の有効期間を含めて、変更前に存在した元の値によって元の行が保存されます。行はtransaction-timeで閉じられるので、その後の変更ではアクセスできなくなります。
- 元の行のコピーが挿入されます。この行のvalid-time期間は、更新の時刻(valid-time列のタイプに応じて、TEMPORAL_TIMESTAMPまたはTEMPORAL_DATE)に終了するように設定されます。その他の列値は変更されません。
つまり、元の行は非有効になったということです。この行は履歴行になり、更新前に有効だった元の列値を示します。
transaction-time次元を含むテーブルに挿入された新しい行には、その行のtransaction-time列の値として(TT_TIMESTAMP, UNTIL_CLOSED)が設定されます。そのため、この行はトランザクション時間でオープンになり、履歴行としてvalid-time SQLでアクセスできる状態を維持します。
- 更新した列に新しい値を保持する元の行のコピーが挿入されます。
この行のvalid-time期間は、更新の時刻に開始し、元の行と同じ時刻に終了するように設定されます。
transaction-time次元を含むテーブルに挿入された新しい行には、その行のtransaction-time列の値として(TT_TIMESTAMP, UNTIL_CLOSED)が設定されます。そのため、この行はトランザクション時間でオープンになり、valid-time SQLでアクセスできる状態を維持します。
- 元の行のtransaction-time期間が更新時(TT_TIMESTAMP)に終了するように設定され、transaction-time次元で閉じられるように行にマークが付けられます。行の他の値は変更されません。
これにより、元の有効期間を含めて、変更前に存在した元の値によって元の行が保存されます。行はtransaction-timeで閉じられるので、その後の変更ではアクセスできなくなります。
- current更新操作により、行が更新されます。
元の行のコピーが挿入されます。この行は、更新した列に新しい値を保持します。current更新のPAは更新時点でのTEMPORAL_TIMESTAMPから始まり、将来に行が変更または削除される不確定の時刻UNTIL_CHANGEDに終了します。このPAは対象行のPVと一致するかPVを収容するため、行のPV全体で変更が有効になります。変更の前後に存在した行状態を説明するために、新しい行をデータベースに追加する必要はありません。
transaction-time次元を含むテーブルに挿入された新しい行には、その行のtransaction-time列の値として(TT_TIMESTAMP, UNTIL_CLOSED)が設定されます。そのため、この行はトランザクション時間でオープンになり、valid-time SQLでアクセスできる状態を維持します。
使用上の注意
- valid-time列の設定に使用されるTEMPORAL_TIMESTAMPの値は、単一の更新操作の結果として生成されるすべての行に対して同じ値になります。
- transaction-time列の設定に使用されるTT_TIMESTAMPの値は、単一の更新操作の結果として生成されるすべての行に対して同じ値になります。
- 対象行への更新が、実際にはどの列値も変更しない場合には、その行に対するテンポラル操作(行のクローズ、オープン、および新しい行の作成)は実行されません。ただし、そのような行は、更新操作のアクティビティ カウントに含まれ、更新トリガーの対象にはなります。
- 変更された行と挿入された行は、テーブルに対するどのような制約にも違反していはいけません。固有性制約がない場合には、挿入された行の重複チェックは実行されません。テーブルに何らかの制約が定義されている場合には、挿入された行が制約に違反していないことを確実にするために、行の検証が実行されます。