こんにちは。codepoet です。
はじめに
プレビュー機能として「CHANGES関数」が追加されました。この関数を使うことで、特定のテーブルのデータ変更履歴をSQLクエリで簡単に取得できるようになります。
従来、データ変更履歴の追跡は、トリガーや外部システムを用いた複雑な仕組みが必要でしたが、CHANGES関数を使えば、SQLクエリだけで実現できるため、開発効率が大幅に向上します。
本記事では、CHANGES関数の概要、使い方を解説していきます。
目次
CHANGES関数とは?
CHANGES関数は、指定したテーブルの、特定の期間におけるデータの変更履歴を返すテーブル関数です。返されるテーブルには、変更前のデータと変更後のデータ、変更日時などが含まれます。
主な特徴
- シンプルなSQL: SQLクエリだけで変更履歴を取得できるため、複雑なコードを書く必要がありません。
- 柔軟な期間指定: 任意の期間の変更履歴を指定できます。
- 変更内容の特定: 変更されたカラムや、変更前の値と変更後の値を特定できます。
CHANGES関数の使い方
CHANGES関数の基本的な使い方は以下の通りです。
CHANGES(
TABLE table,
start_timestamp DEFAULT NULL,
end_timestamp)
シンプルですね。
-
table_name
: 変更履歴を取得したいテーブルの名前を指定します。 -
start_timestamp
: (省略可) 変更履歴を取得する開始時刻を指定します。NULL を指定すると、テーブル作成以降のすべての変更が取得されます。 -
end_timestamp
: 必須。変更履歴を取得する終了時刻を指定します。現在の時刻から10分以上前 の値を設定する必要があります。最大で1日間の範囲を指定できます。
CHANGES関数の例
Produce
というテーブルに対して変更を行い、CHANGES関数で取得される変更履歴を出力します。
-- テーブルの作成
CREATE TABLE mydataset.Produce (
product STRING,
inventory INT64
)
OPTIONS(enable_change_history=true);
-- 2行のデータを挿入
INSERT INTO mydataset.Produce
VALUES
('bananas', 20),
('carrots', 30);
-- 1行のデータを更新
UPDATE mydataset.Produce
SET inventory = inventory - 10
WHERE product = 'carrots';
-- 1行のデータを削除
DELETE FROM mydataset.Produce
WHERE product = 'bananas';
-- 10分待ってから、すべての変更履歴を取得
SELECT
product,
inventory,
_CHANGE_TYPE AS change_type,
_CHANGE_TIMESTAMP AS change_time
FROM
CHANGES(TABLE mydataset.Produce, NULL, TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 601 SECOND))
ORDER BY change_time, product;
出力結果:
ポイント:
- テーブルの変更履歴を取得するには、
enable_change_history
オプション をTRUE
に設定する必要があります。このオプションを有効にすると、課金が発生する可能性があるので注意してください。(料金の詳細については、BigQueryのドキュメントを参照してください) - 取得できる変更履歴は、テーブルの時系列制限期間に依存します。
利用シーン
- データ監査: データの変更履歴を監査し、不正な変更や誤操作がないか確認する。
- データ復元: データが誤って削除された場合、変更履歴からデータを復元する。
- データ分析: データの変更パターンを分析し、意思決定に役立てる。
- デバッグ: アプリケーションの不具合の原因を特定するために、変更履歴を調べることで、問題発生時の状況を把握する。
まとめ
CHANGES関数は、データの変更履歴を詳細に追跡できる機能です。
ただし、CHANGES関数の利用には、パフォーマンス、コスト、データの保持期間など、いくつかの注意点もありますので、ユースケースに合わせて、CHANGES関数を活用してみてください。