非テンポラル テーブルまたはvalid-timeテーブルにtransaction-time列を追加するには、ALTER TABLE文を使用します。
テンポラル テーブルは、固有プライマリ インデックスを持つことはできません。元の非テンポラル テーブルに固有プライマリ インデックスがある場合、テンポラル列を追加する前に、ALTER TABLEを使用してプライマリ インデックスを非固有に変更してください。テンポラル テーブルに対する固有性は、他の制約を使用して適用できます。詳細については、テンポラル テーブルに対する制約の使用を参照してください。
例: 2つの既存のタイムスタンプ列に基づくTransaction-Time列の作成
非テンポラル テーブルに、期間の開始境界値と終了境界値を表現する2つの既存のTIMESTAMP(6) WITH TIME ZONE列がある場合、これらの列に基づくテーブルに、派生PERIOD列を追加できます。派生PERIOD列をtransaction-timet列として使用し、テーブルをテンポラル テーブルに変換することができます。
元は次のDDL文を使用してテーブルが作成されたとします。
CREATE MULTISET TABLE Policy( Policy_ID INTEGER, Customer_ID INTEGER, Policy_Type CHAR(2) NOT NULL, Policy_Details CHAR(40), Policy_Tx_Begin TIMESTAMP(6) WITH TIME ZONE NOT NULL, Policy_Tx_End TIMESTAMP(6) WITH TIME ZONE NOT NULL ) PRIMARY INDEX(Policy_ID);
テーブルをテンポラル テーブルに変換する前に、既存の制約をメモしてから削除する必要があります。次の文を使用して、テーブルをtransaction-timeテーブルに変換することができます。
ALTER TABLE Policy ADD PERIOD FOR Policy_Tx_Duration (Policy_Tx_Begin,Policy_Tx_End) AS TRANSACTIONTIME;
テンポラル テーブルを作成した後で、削除された制約を再適用できます。
例: PERIODデータ型transaction-time列の追加
継続時間データを含んでいない以下の非テンポラル テーブルの定義について検討します。
CREATE MULTISET TABLE Customer ( Customer_Name VARCHAR(40), Customer_ID INTEGER, Customer_Address VARCHAR(80), Customer_Phone VARCHAR(12) ) PRIMARY INDEX (Customer_ID);
次の文は、Customerテーブルにtransaction-time列を追加します。
ALTER TABLE Customer ADD Customer_Duration PERIOD(TIMESTAMP(6) WITH TIME ZONE) NOT NULL AS TRANSACTIONTIME;
PERIOD列のTransaction-Time列への変換
PERIOD(TIMESTAMP(6) WITH ZONE)というタイプの列を含むテーブルがある場合、次の手順を実行して既存のPERIOD列をtransaction-time列に変換します。
- 元のテーブルに対するすべての制約情報をメモします。
- 元のテーブルに対するすべての制約を削除します。
- テーブルのユーザーにNONTEMPORAL権限を付与します。
- ALTER TABLEを使用して、transaction-time列を追加します。
- NONTEMPORAL UPDATEを実行し、変換する既存の列の値で新しいtransaction-time列を設定します。
- ALTER TABLEを使用して、既存のPERIOD列を削除します。
- ALTER TABLEを使用して、transaction-time列の名前を削除した列の名前に変更します。
- 事前に削除したすべての制約を、目的に合ったtransaction-time修飾子を使用して作成します。