カテゴリ:

クエリ構文

CHANGES

CHANGES 句を使用すると、明示的なトランザクションオフセットでテーブルストリームを作成しなくても、指定された時間内にテーブルの変更追跡メタデータをクエリできます。複数のクエリにより、異なるトランザクションの開始と終了の間で変更追跡メタデータを取得できます。

注釈

テーブルで変更追跡を有効にするか、テーブルでストリームを作成する必要があります。詳細については、使用上の注意 (このトピック内)をご参照ください。

クエリでは、テーブル名の直後の FROM 句で CHANGES 句が指定されています。

オプションの END キーワードは、変更間隔の終了タイムスタンプを指定します。

構文

SELECT ...
FROM ...
   CHANGES ( INFORMATION => { DEFAULT | APPEND_ONLY } )
   AT( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> } ) | BEFORE( STATEMENT => <id> )
   [ END( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> } ) ]
[ ... ]
INFORMATION => { DEFAULT | APPEND_ONLY }

それぞれに記録されたメタデータに基づいて返す、変更追跡データの型を指定します。

DEFAULT

挿入、更新、削除(テーブルの切り捨てを含む)を含む、ソーステーブルに対するすべての DML の変更を返します。この変更追跡データの型は、変更セットで挿入および削除された行で結合を実行して、行レベルのデルタを提供します。たとえば、実質的な効果として、テーブル内の2つのトランザクションポイントの間に挿入されてから削除された行は、デルタで削除されます(つまり、クエリ結果内に返されない)。

APPEND_ONLY

追加された行のみを返します。したがって、結合は実行されません。その結果、追加のみの変更のクエリは、行の挿入のみに依存する抽出、ロード、変換(ELT)および類似したシナリオの標準(デフォルト)変更のクエリよりも、はるかにパフォーマンスが高くなる可能性があります。

TIMESTAMP => タイムスタンプ

Time Travelに使用する正確な日付と時刻を指定します。値は明示的に TIMESTAMP にキャストする必要があることに注意してください。

OFFSET => 時差

Time Travelに使用する現在の時刻との差を秒単位で -N の形式で指定します。 N は整数または数式です(例: -120 は120秒、 -30*60 は1800秒または30分)。

STATEMENT => ID

Time Travelの参照ポイントとして使用するステートメントのクエリ ID を指定します。このパラメーターは、次のいずれかのタイプのステートメントをサポートします。

  • DML (例: INSERT、 UPDATE、 DELETE)

  • TCL (BEGIN、 COMMIT トランザクション)

  • SELECT

使用上の注意

  • 現在、テーブルの変更追跡メタデータが記録される前に、次の 少なくとも1つ がtrueである必要があります。

    • テーブルで変更追跡が有効になります( ALTER TABLE ... CHANGE_TRACKING = TRUE を使用)。

    • テーブルのストリームが作成されます( CREATE STREAM を使用)。

    どちらのオプションでも、非表示の列のペアがテーブルに追加され、変更追跡メタデータの保存が開始されます。列は少量のストレージを消費します。

    これらの条件のいずれかが満たされる前の期間では、テーブルの変更追跡メタデータは使用できません。

  • AT | BEFORE 句は必須であり、変更追跡メタデータの現在のオフセットを設定します。

  • オプションの END 句は、変更間隔の終了タイムスタンプを設定します。 END 値が指定されていない場合、現在のタイムスタンプが変更間隔の終了として使用されます。

    END 句は、変更追跡メタデータをクエリする目的で CHANGES 句と組み合わせる場合にのみ有効であることに注意してください(つまり、他のオブジェクトの履歴データをクエリするためにTime Travelを使用する場合、この句を AT|BEFORE と組み合わせることはできない)。

  • TIMESTAMP または OFFSET の値は定数式でなければなりません。

  • TIMESTAMP の最小時間解像度はミリ秒です。

  • 要求されたデータがTime Travel保持期間(デフォルトは1日)を超えている場合、ステートメントは失敗します。

    さらに、要求されたデータがTime Travel保持期間内にあるが、履歴データが利用できない場合(保持期間が延長された場合など)、ステートメントは失敗します。

次の例では、テーブルの標準(デルタ)、および追加のみの変更追跡メタデータをクエリします。 END()値が指定されていないため、現在のタイムスタンプがトランザクション時間のエンドポイントとして使用されます。

 CREATE OR REPLACE TABLE t1 (
   id number(8) NOT NULL,
   c1 varchar(255) default NULL
 );

-- Enable change tracking on the table.
 ALTER TABLE t1 SET CHANGE_TRACKING = TRUE;

 -- Initialize a session variable for the current timestamp.
 SET ts1 = (SELECT CURRENT_TIMESTAMP());

 INSERT INTO t1 (id,c1)
 VALUES
 (1,'red'),
 (2,'blue'),
 (3,'green');

 DELETE FROM t1 WHERE id = 1;

 UPDATE t1 SET c1 = 'purple' WHERE id = 2;

 -- Query the change tracking metadata in the table during the interval from $ts1 to the current time.
 -- Return the full delta of the changes.
 SELECT *
 FROM t1
   CHANGES(INFORMATION => DEFAULT)
   AT(TIMESTAMP => $ts1);

 +----+--------+-----------------+-------------------+------------------------------------------+
 | ID | C1     | METADATA$ACTION | METADATA$ISUPDATE | METADATA$ROW_ID                          |
 |----+--------+-----------------+-------------------+------------------------------------------|
 |  2 | purple | INSERT          | False             | 1614e92e93f86af6348f15af01a85c4229b42907 |
 |  3 | green  | INSERT          | False             | 86df000054a4d1dc64d5d74a44c3131c4c046a1f |
 +----+--------+-----------------+-------------------+------------------------------------------+

 -- Query the change tracking metadata in the table during the interval from $ts1 to the current time.
 -- Return the append-only changes.
 SELECT *
 FROM t1
   CHANGES(INFORMATION => APPEND_ONLY)
   AT(TIMESTAMP => $ts1);

 +----+-------+-----------------+-------------------+------------------------------------------+
 | ID | C1    | METADATA$ACTION | METADATA$ISUPDATE | METADATA$ROW_ID                          |
 |----+-------+-----------------+-------------------+------------------------------------------|
 |  1 | red   | INSERT          | False             | 6a964a652fa82974f3f20b4f49685de54eeb4093 |
 |  2 | blue  | INSERT          | False             | 1614e92e93f86af6348f15af01a85c4229b42907 |
 |  3 | green | INSERT          | False             | 86df000054a4d1dc64d5d74a44c3131c4c046a1f |
 +----+-------+-----------------+-------------------+------------------------------------------+

次の例では、テーブルから行が削除される前のトランザクションの時点から、テーブルの追加のみの変更を使用します。

CREATE OR REPLACE TABLE t1 (
  id number(8) NOT NULL,
  c1 varchar(255) default NULL
);

-- Enable change tracking on the table.
ALTER TABLE t1 SET CHANGE_TRACKING = TRUE;

-- Initialize a session variable for the current timestamp.
SET ts1 = (SELECT CURRENT_TIMESTAMP());

INSERT INTO t1 (id,c1)
VALUES
(1,'red'),
(2,'blue'),
(3,'green');

SET ts2 = (SELECT CURRENT_TIMESTAMP());

DELETE FROM t1;

CREATE OR REPLACE TABLE t2 (
  c1 varchar(255) default NULL
  )
AS SELECT C1
  FROM t1
  CHANGES(INFORMATION => APPEND_ONLY)
  AT(TIMESTAMP => $ts1)
  END(TIMESTAMP => $ts2);

SELECT * FROM t2;

+-------+
| C1    |
|-------|
| red   |
| blue  |
| green |
+-------+