システム期間テンポラル表のデータを更新すると、その結果として、それに関連付けられている履歴表に行が追加されます。
policy_id | coverage | sys_start | sys_end | ts_id |
---|---|---|---|---|
A123 | 12000 | 2010-01-31- 22.31.33. 495925000000 |
9999-12-30- 00.00.00. 000000000000 |
2010-01-31- 22.31.33. 495925000000 |
B345 | 18000 | 2010-01-31- 22.31.33. 495925000000 |
9999-12-30- 00.00.00. 000000000000 |
2010-01-31- 22.31.33. 495925000000 |
C567 | 20000 | 2010-01-31- 22.31.33. 495925000000 |
9999-12-30- 00.00.00. 000000000000 |
2010-01-31- 22.31.33. 495925000000 |
UPDATE policy_info
SET coverage = 25000
WHERE policy_id = 'C567';
policy_id | coverage | sys_start | sys_end | ts_id |
---|---|---|---|---|
A123 | 12000 | 2010-01-31- 22.31.33. 495925000000 |
9999-12-30- 00.00.00. 000000000000 |
2010-01-31- 22.31.33. 495925000000 |
B345 | 18000 | 2010-01-31- 22.31.33. 495925000000 |
9999-12-30- 00.00.00. 000000000000 |
2010-01-31- 22.31.33. 495925000000 |
C567 | 25000 | 2011-02-28- 09.10.12. 649592000000 |
9999-12-30- 00.00.00. 000000000000 |
2011-02-28- 09.10.12. 649592000000 |
policy_id | coverage | sys_start | sys_end | ts_id |
---|---|---|---|---|
C567 | 20000 | 2010-01-31- 22.31.33. 495925000000 |
2011-02-28- 09.10.12. 649592000000 |
2010-01-31- 22.31.33. 495925000000 |
UPDATE (SELECT * FROM policy_info
FOR SYSTEM_TIME AS OF '2010-01-31-22.31.33.495925000000')
SET coverage = coverage + 1000;
この更新では、履歴行の更新を暗黙的に試行するので、エラーが返されます。
SELECT は policy_info 表を明示的に照会し、それに関連付けられた履歴表 (hist_policy_info) を暗黙的に照会しています。
hist_policy_info の C567 行が SELECT によって返されますが、暗黙的にアクセスされた履歴表の行は更新できません。単一の SQL トランザクションの中で複数の行を挿入または更新する場合、行開始列の値は、影響を受けるすべての行で同じになります。 その値は、トランザクションの最初のデータ変更ステートメントの実行時にシステム・クロックを読み取ることによって取得されます。 例えば、トランザクション ABC に関連付けられている時刻はすべて T1 になります。
トランザクション ABC | トランザクション XYZ |
---|---|
|
|
|
|
|
policy_id | coverage | sys_start | sys_end | ts_id |
---|---|---|---|---|
S777 | 7000 | T1 | max | T1 |
T888 | 8000 | T2 | max | T2 |
policy_id | coverage | sys_start | sys_end | ts_id |
---|---|---|---|---|
S777 | 7000 | T1 | max | T1 |
X999 | 8000 | T1 | max | T1 |
policy_id | coverage | sys_start | sys_end | ts_id |
---|---|---|---|---|
T888 | 8000 | T2 | T1 | T2 |
policy_id | coverage | sys_start | sys_end | ts_id |
---|---|---|---|---|
S777 | 7000 | T1 | max | T1 |
X999 | 8000 | T2+delta | max | T1 |
Y555 | 9000 | T1 | max | T1 |
policy_id | coverage | sys_start | sys_end | ts_id |
---|---|---|---|---|
T888 | 8000 | T2 | T2+delta | T2 |
トランザクション ABC |
---|
T6: UPDATE policy_info SET policy_id = 'R111' WHERE policy_id = 'X999'; |
T7: COMMIT; |
policy_id | coverage | sys_start | sys_end | ts_id |
---|---|---|---|---|
S777 | 7000 | T1 | max | T1 |
R111 | 8000 | T1 | max | T1 |
Y555 | 9000 | T1 | max | T1 |
policy_id | coverage | sys_start | sys_end | ts_id |
---|---|---|---|---|
T888 | 8000 | T2 | T2+delta | T2 |
CREATE VIEW viewA AS SELECT * FROM policy_info;
UPDATE viewA SET col2 = col2 + 1000;
システム期間テンポラル表またはバイテンポラル表を参照するビューのビュー定義に FOR SYSTEM_TIME 節が含まれる場合、INSTEAD OF トリガーを定義することによってそのビューを更新可能にすることができます。
以下の例は、regular_table 表を更新します。
CREATE VIEW viewB AS SELECT * FROM policy_info;
FOR SYSTEM_TIME BETWEEN
TIMESTAMP '2010-01-01 10:00:00' AND TIMESTAMP '2011-01-01 10:00:00';
CREATE TRIGGER update INSTEAD OF UPDATE ON viewB
REFERENCING NEW AS n FOR EACH ROW
UPDATE regular_table SET col1 = n.id;
UPDATE viewB set id = 500;