カテゴリ:

クエリ構文

CHANGES

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

注釈

ソーステーブルまたはソースビューとその基になるテーブルで変更追跡を有効にする必要があります。詳細については、使用上の注意 (このトピック内)をご参照ください。

クエリでは、 FROM 句で CHANGES 句が指定されています。

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

構文

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

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

DEFAULT

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

APPEND_ONLY

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

TIMESTAMP => timestamp

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

OFFSET => time_difference

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

STATEMENT => id

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

  • DML (例: INSERT、 UPDATE、 DELETE)

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

  • SELECT

STREAM => 'name'

クエリされたテーブルまたはビューの既存のストリームに対する識別子(つまり、名前)を指定します。ストリーム内の現在のオフセットは、ソースオブジェクトの変更データを返すための AT 時点として使用されます。

使用上の注意

  • ディレクトリテーブル または 外部テーブル の変更(変更追跡メタデータを使用して解決)をクエリする場合、 CHANGES 句はサポート されません

  • 現在、テーブルの変更追跡メタデータが記録される前に、次の 少なくとも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 |
 +----+-------+-----------------+-------------------+------------------------------------------+
Copy

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

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 'start timestamp' variable for the current timestamp.
SET ts1 = (SELECT CURRENT_TIMESTAMP());

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

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

DELETE FROM t1;

-- Create a table populated by the change data between the start and end timestamps.
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 |
+-------+
Copy

次の例は、前述の例と似ています。この例では、ソーステーブルからの変更データを新しいテーブルに入力するための開始点として、ソーステーブルのストリームに対する現在のオフセットを使用します。ストリームはソースオブジェクトで作成されるため、オブジェクトで変更の追跡を明示的に有効にする必要はありません。

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

-- Create a stream on the table.
CREATE OR REPLACE STREAM s1 ON TABLE t1;

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

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

DELETE FROM t1;

-- Create a table populated by the change data between the current
-- s1 offset and the end timestamp.
CREATE OR REPLACE TABLE t2 (
  c1 varchar(255) default NULL
  )
AS SELECT C1
  FROM t1
  CHANGES(INFORMATION => APPEND_ONLY)
  AT(STREAM => 's1')
  END(TIMESTAMP => $ts2);

SELECT * FROM t2;

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