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
:
- Pernyataan DDL
CREATE TABLE
- Pernyataan DML
INSERT
- Pernyataan DML
MERGE
- Memuat data ke BigQuery
- Penyerapan streaming
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 kataTABLE
.start_timestamp
:TIMESTAMP
yang menunjukkan waktu paling awal saat perubahan disertakan dalam output. JikaNULL
, semua perubahan sejak pembuatan tabel akan ditampilkan. Jika tabel dibuat setelahstart_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 adalahNULL
, 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 nilaiNULL
yang diisi di baris mana pun yang disisipkan sebelum penambahan kolom. _CHANGE_TYPE
:STRING
yang menunjukkan jenis perubahan yang menghasilkan baris. UntukAPPENDS
, satu-satunya nilai yang didukung adalahINSERT
._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.