Menggunakan histori perubahan

Dengan histori perubahan BigQuery, Anda dapat melacak histori perubahan pada suatu tabel BigQuery. Histori perubahan untuk suatu tabel ditampilkan sebagai fungsi bernilai tabel (TVF) SQL yang menunjukkan jenis perubahan tertentu yang dibuat selama rentang waktu yang ditentukan. Dengan fitur ini, Anda dapat memproses perubahan inkremental yang dilakukan pada tabel. Memahami perubahan yang telah dilakukan pada suatu tabel dapat membantu Anda melakukan hal-hal seperti mempertahankan replika tabel secara bertahap di luar BigQuery sambil menghindari salinan yang mahal.

Izin yang diperlukan

Untuk melihat histori perubahan pada suatu tabel, Anda memerlukan izin bigquery.tables.getData untuk tabel tersebut. Peran Identity and Access Management (IAM) yang telah ditetapkan berikut mencakup izin ini:

  • roles/bigquery.dataViewer
  • roles/bigquery.dataEditor
  • roles/bigquery.dataOwner
  • roles/bigquery.admin

Jika tabel memiliki, atau telah memiliki, kebijakan akses tingkat baris, hanya administrator tabel yang dapat mengakses data historis untuk tabel tersebut. Izin bigquery.rowAccessPolicies.overrideTimeTravelRestrictions diperlukan pada tabel dan disertakan dalam peran IAM roles/bigquery.admin yang telah ditetapkan.

Jika tabel memiliki keamanan tingkat kolom, Anda hanya dapat melihat histori perubahan di kolom yang dapat Anda akses.

TVF APPENDS

TVF APPENDS menampilkan tabel semua baris yang ditambahkan ke tabel selama rentang waktu tertentu. Operasi berikut menambahkan baris ke histori perubahan APPENDS:

Sintaksis

APPENDS(
  TABLE table,
  start_timestamp DEFAULT NULL,
  end_timestamp DEFAULT NULL)
  • table: nama tabel BigQuery. Data tersebut tidak boleh berupa tabel virtual, subkueri, tabel eksternal, tampilan terwujud, atau tabel karakter pengganti. Argumen ini harus didahului dengan kata TABLE.
  • start_timestamp: TIMESTAMP yang menunjukkan waktu paling awal saat perubahan disertakan dalam output. Jika NULL, semua perubahan sejak pembuatan tabel akan ditampilkan. Jika tabel dibuat setelah start_timestamp, waktu pembuatan tabel yang sebenarnya akan digunakan. Jika waktu lebih awal dari yang diizinkan oleh perjalanan waktu, error akan ditampilkan. Untuk tabel standar, periode ini adalah tujuh hari, tetapi Anda dapat mengonfigurasi periode perjalanan waktu menjadi kurang dari itu.
  • end_timestamp: TIMESTAMP yang menunjukkan waktu terbaru, eksklusif, saat perubahan disertakan dalam output. Jika yang ditampilkan adalah NULL, semua perubahan yang dibuat hingga awal kueri akan disertakan.

Nilai yang ditampilkan

TVF APPENDS menampilkan tabel dengan kolom berikut:

  • Semua kolom tabel input pada saat kueri dijalankan. Jika kolom ditambahkan setelah end_timestamp, kolom tersebut akan muncul dengan nilai NULL yang diisi di baris mana pun yang disisipkan sebelum penambahan kolom.
  • _CHANGE_TYPE: STRING yang menunjukkan jenis perubahan yang menghasilkan baris. Untuk APPENDS, satu-satunya nilai yang didukung adalah INSERT.
  • _CHANGE_TIMESTAMP: TIMESTAMP yang menunjukkan waktu commit dari transaksi yang membuat perubahan.

Detail

Kumpulan data baris yang disisipkan akan tetap ada meskipun data tersebut nantinya dihapus. Penghapusan tidak tercermin dalam TVF APPENDS. Jika tabel disalin, memanggil TVF APPENDS pada tabel yang disalin akan menampilkan setiap baris seperti yang disisipkan pada saat pembuatan tabel. Jika baris diubah karena operasi UPDATE, tidak akan ada pengaruh apa pun.

Contoh

Contoh ini menunjukkan histori perubahan yang ditampilkan oleh APPENDS saat berbagai perubahan dilakukan pada tabel bernama Produce. Contoh ini mungkin tidak berfungsi jika diselesaikan dalam durasi yang lebih lama dari periode perjalanan waktu Anda. Pertama, buat tabel.

CREATE TABLE mydataset.Produce (product STRING, inventory INT64) AS (
  SELECT "apples" AS product, 10 AS inventory);

Selanjutnya, masukkan dua baris ke dalam tabel.

INSERT INTO mydataset.Produce
VALUES
  ("bananas", 20),
  ("carrots", 30);

Lihat histori perubahan lengkap tentang penambahan. Gunakan nilai NULL untuk mendapatkan histori lengkap dalam periode perjalanan waktu.

SELECT
  product,
  inventory,
  _CHANGE_TYPE AS change_type,
  _CHANGE_TIMESTAMP AS change_time
FROM
  APPENDS(TABLE mydataset.Produce, NULL, NULL);

Outputnya mirip dengan hal berikut ini:

+---------+-----------+-------------+--------------------------------+
| product | inventory | change_type | change_time                    |
+---------+-----------+-------------+--------------------------------+
| apples  | 10        | INSERT      | 2022-04-15 20:06:00.488000 UTC |
| bananas | 20        | INSERT      | 2022-04-15 20:06:08.490000 UTC |
| carrots | 30        | INSERT      | 2022-04-15 20:06:08.490000 UTC |
+---------+-----------+-------------+--------------------------------+

Selanjutnya, tambahkan kolom, sisipkan suatu baris nilai baru, perbarui inventaris, dan hapus baris "bananas".

ALTER TABLE mydataset.Produce ADD COLUMN color STRING;
INSERT INTO mydataset.Produce VALUES ("grapes", 40, "purple");
UPDATE mydataset.Produce SET inventory = inventory + 5 WHERE TRUE;
DELETE mydataset.Produce WHERE product = "bananas";

Lihat tabel baru.

SELECT * FROM mydataset.Produce;
+---------+-----------+--------+
| product | inventory | color  |
+---------+-----------+--------+
| apples  | 15        | NULL   |
| carrots | 35        | NULL   |
| grapes  | 45        | purple |
+---------+-----------+--------+

Lihat histori perubahan lengkap tentang penambahan.

SELECT
  product,
  inventory,
  color,
  _CHANGE_TYPE AS change_type,
  _CHANGE_TIMESTAMP AS change_time
FROM
  APPENDS(TABLE mydataset.Produce, NULL, NULL);

Outputnya mirip dengan hal berikut ini:

+---------+-----------+--------+-------------+--------------------------------+
| product | inventory | color  | change_type | change_time                    |
+---------+-----------+--------+-------------+--------------------------------+
| apples  | 10        | NULL   | INSERT      | 2022-04-15 20:06:00.488000 UTC |
| bananas | 20        | NULL   | INSERT      | 2022-04-15 20:06:08.490000 UTC |
| carrots | 30        | NULL   | INSERT      | 2022-04-15 20:06:08.490000 UTC |
| grapes  | 40        | purple | INSERT      | 2022-04-15 20:07:45.751000 UTC |
+---------+-----------+--------+-------------+--------------------------------+

Kolom inventory menampilkan nilai yang ditetapkan saat baris pertama kali disisipkan ke dalam tabel. Baris ini tidak menunjukkan perubahan dari pernyataan UPDATE. Baris dengan informasi tentang pisang atau bananas masih ada karena TVF APPENDS hanya menangkap penambahan ke tabel, bukan penghapusan.

Batasan

Histori perubahan memiliki batasan berikut:

  • Anda hanya dapat melihat informasi tentang penambahan, bukan pembaruan atau penghapusan.
  • Data ini dibatasi pada periode perjalanan waktu pada tabel.