- 类别:
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> } ) ]
[ ... ]
INFORMATION => { DEFAULT | APPEND_ONLY }
根据每个语法中记录的元数据,指定要返回的变更跟踪数据的类型:
DEFAULT
返回源对象的所有 DML 变更,包括插入、更新和删除(包括表截断)。这种类型的变更跟踪会比较变更集中已插入和删除的行,以提供行级别增量。例如,最终效果是,在表中的两个事务时间点之间插入且随后删除的行将在增量中移除(即在查询结果中不会返回此类行)。
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
时间点。
使用说明¶
目前,在记录表的变更跟踪元数据之前,必须:emph:至少满足以下条件之一:
在表上启用变更跟踪(使用 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 '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 |
+-------+
以下示例与上一个示例类似。此示例使用源表上流的当前偏移量作为使用源表中的变更数据填充新表的时间起点。由于在源对象上创建了流,因此无需在对象上显式启用变更跟踪:
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 |
+-------+