16.20 - ALTER TABLE (ANSI System-Timeテーブル フォーム) - Teradata Vantage NewSQL Engine

Teradata Vantage™ ANSIテンポラル テーブル サポート

prodname
Teradata Database
Teradata Vantage NewSQL Engine
vrm_release
16.20
category
プログラミング リファレンス
featnum
B035-1186-162K-JPN

目的

ALTER TABLEのテンポラル構文で既存のテーブルのANSIテンポラルsystem-timeテーブルを作成することができます。

テーブルへのsystem-timeの追加には、次のALTER TABLE操作が含まれます。

  • system-time期間の開始境界および終了境界として使用される列を指定して、SYSTEM_TIME派生期間列をテーブルに追加する
  • system-time期間の開始境界および終了境界として使用される列を追加または変更する。これらの列がテーブル内にすでに存在する場合は、特殊な属性を追加する必要があります。
  • システムのバージョン情報のテーブルへの追加

構文

次のALTER TABLE構文を使用して、system-time派生期間列および構成要素の開始列と終了列を1つのALTER TABLE文に追加することにより、system-timeテーブルを作成します。



system-timeテーブルはテンポラル テーブルとはみなされず、テーブルにシステムのバージョン情報が追加されるまで特別なテンポラル動作を提供できません。別のALTER TABLE文で次の構文を使用して、system-timeテーブルにシステムのバージョン情報を追加します。



table_name
system-timeテーブルの名前。データベース修飾子を含む場合があります。
PERIOD FOR SYSTEM_TIME
system-time派生期間列を作成します。
sys_start
system-time期間の開始境界を保存する列の名前。
GENERATED ALWAYS AS ROW START
system-time期間の開始境界を定義する列の必須属性。
sys_end
system-time期間の終了境界を保存する列の名前。
GENERATED ALWAYS AS ROW END
system-time期間の終了境界を定義する列の必須属性。
SYSTEM VERSIONING
system-timeテンポラル テーブルの必須属性。
ALTER TABLE文の構成要素は表示されたとおりの順序でなければならず、構成要素の開始列と終了列の前に派生期間列を定義する必要があります。この場合、ADD句間にカンマはありません。

ANSI準拠

この文は、ANSI SQL:2011に準拠しています。

使用上の注意

テーブルがシステムのバージョン情報を含むsystem-timeテーブルに変換された後は、ほとんどのALTER TABLE操作を実行できません。これらのテーブルは通常、規制およびコンプライアンス目的で使用され、テーブル構造に変更を加えると、それらの目的が損なわれる可能性があります。システムのバージョン情報を含むsystem-timeテーブルを非テンポラル テーブルに復元するには、システムのバージョン情報を削除します。その後、通常のALTER TABLE操作をすべて使用できます。

システムのバージョン情報の削除の詳細は、System-Timeとシステムのバージョン情報の削除を参照してください。

例: 非テンポラル テーブルをANSI System-Timeテーブルに変換するALTER TABLE

次のSQL文は通常の非テンポラル テーブルを作成し、行をいくつか挿入します。

CREATE MULTISET TABLE employee_systime (
 eid INTEGER NOT NULL,
 ename VARCHAR(10) NOT NULL,
 deptno INTEGER NOT NULL,
 sys_start TIMESTAMP(6) WITH TIME ZONE NOT NULL,
 sys_end TIMESTAMP(6) WITH TIME ZONE NOT NULL
 ) PRIMARY INDEX(eid);

INSERT INTO employee_systime VALUES 
 (1001,'Sania',111,TIMESTAMP'2002-01-01 00:00:00.000000-08:00',
                   TIMESTAMP'9999-12-31 23:59:59.999999+00:00');
INSERT INTO employee_systime VALUES 
 (1002,'Ash',333,TIMESTAMP'2003-07-01 12:11:00.000000-08:00',
                 TIMESTAMP'9999-12-31 23:59:59.999999+00:00');
INSERT INTO employee_systime VALUES 
 (1003,'SRK',111,TIMESTAMP'2004-02-10 00:00:00.000000-08:00',
                 TIMESTAMP'2006-03-01 00:00:00.000000-08:00');
INSERT INTO employee_systime VALUES 
 (1004,'Fred',222, TIMESTAMP'2002-07-01 12:00:00.350000-08:00',
                   TIMESTAMP'2005-05-01 12:00:00.350000-08:00');
INSERT INTO employee_systime VALUES 
 (1005,'Alice',222,TIMESTAMP'2004-12-01 00:12:23.120000-08:00',
                   TIMESTAMP'2005-05-01 12:00:00.450000-08:00');
INSERT INTO employee_systime VALUES 
 (1004,'Fred',555, TIMESTAMP'2005-05-01 12:00:00.350000-08:00',
                   TIMESTAMP'9999-12-31 23:59:59.999999+00:00');
INSERT INTO employee_systime VALUES 
 (1005,'Alice',555,TIMESTAMP'2005-05-01 12:00:00.450000-08:00',
                   TIMESTAMP'9999-12-31 23:59:59.999999+00:00');

このテーブルはまだテンポラル テーブルではないため、テーブルの無条件のSELECTは、行がシステム時間でオープンかクローズかに関わらず、すべての行を返します。

SELECT * FROM employee_systime;

 eid ename  deptno                        sys_start                          sys_end
---- ------ ------ -------------------------------- --------------------------------
1002  Ash      333 2003-07-01 12:11:00.000000-08:00 9999-12-31 23:59:59.999999+00:00
1005  Alice    222 2004-12-01 00:12:23.120000-08:00 2005-05-01 12:00:00.450000-08:00
1004  Fred     222 2002-07-01 12:00:00.350000-08:00 2005-05-01 12:00:00.350000-08:00
1005  Alice    555 2005-05-01 12:00:00.450000-08:00 9999-12-31 23:59:59.999999+00:00
1004  Fred     555 2005-05-01 12:00:00.350000-08:00 9999-12-31 23:59:59.999999+00:00
1001  Sania    111 2002-01-01 00:00:00.000000-08:00 9999-12-31 23:59:59.999999+00:00
1003  SRK      111 2004-02-10 00:00:00.000000-08:00 2006-03-01 00:00:00.000000-08:00


2つのALTER TABLE文でテーブルをsystem-timeテンポラル テーブルに変更できます。

ALTER TABLE employee_systime
 ADD PERIOD FOR SYSTEM_TIME(sys_start,sys_end)
 ADD sys_start TIMESTAMP(6) WITH TIME ZONE NOT NULL 
               GENERATED ALWAYS AS ROW START
 ADD sys_end TIMESTAMP(6) WITH TIME ZONE NOT NULL 
               GENERATED ALWAYS AS ROW END;
ALTER TABLE employee_systime
 ADD SYSTEM VERSIONING;


ここで、無条件のSELECTにはシステム時間でオープンの行のみ表示されます。

SELECT * FROM employee_systime;

 eid ename  deptno                        sys_start                          sys_end
---- ------ ------ -------------------------------- --------------------------------
1002 Ash       333 2003-07-01 12:11:00.000000+00:00 9999-12-31 23:59:59.999999+00:00
1001 Sania     111 2002-01-01 00:00:00.000000+00:00 9999-12-31 23:59:59.999999+00:00
1001 Fred      222 2002-07-01 12:00:00.350000+00:00 9999-12-31 23:59:59.999999+00:00
1003 Alice     222 2004-12-01 00:12:23.120000+00:00 9999-12-31 23:59:59.999999+00:00


特別なテンポラル修飾子でsystem-timeテーブルのクローズ行を表示できます。詳細については、ANSI System-Timeテーブルの問合わせを参照してください。

System-Timeとシステムのバージョン情報の削除

システムのバージョン情報を含むsystem-timeテーブルは、通常、規制および法令順守の目的で使用され、さらにテーブル データへのデータベース操作のテーブル固有履歴を保持するために使用されます。このため、これらのテーブルに対してほとんどタイプのALTER TABLEによる変更は実行できません。ただし、ALTER TABLEを使用してシステムのバージョン情報を削除することはできます。テンポラル テーブルからシステムのバージョン情報を削除した後、テーブルは通常の非テンポラル テーブルになり、通常のALTER TABLE操作はすべて実行できます。

次のALTER TABLE構文を使用して、system-timeテーブルからシステムのバージョン情報を削除します。

ALTER TABLE  your_system_time_table  DROP SYSTEM VERSIONING;

ここで、your_system_time_tableはシステムのバージョン情報を含むsystem-timeテーブルの名前です。

system-timeテーブルからシステムのバージョン情報を削除すると、テーブルからすべてのクローズ行が削除され、テーブルが非テンポラル テーブルになります。

system-time列(派生期間列およびその構成要素の開始/終了境界TIMESTAMP列を含む)を削除するには、次のALTER TABLE構文を使用します。

ALTER TABLE  your_system_time_table  DROP PERIOD FOR SYSTEM_TIME;

ここでも、your_system_time_tableはシステムのバージョン情報を含むsystem-timeテーブルの名前です。

system-time派生期間列を削除すると、自動的に2つの構成要素列が削除されます。

SYSTEM_TIME派生期間列と構成要素列を削除する前に、system-timeテーブルからシステムのバージョン情報を削除する必要があります。