Bagikan melalui


CHANGETABLE (Transact-SQL)

Berlaku untuk: SQL ServerAzure SQL Database Azure SQL Managed Instance

Mengembalikan informasi pelacakan perubahan untuk tabel. Anda dapat menggunakan pernyataan ini untuk mengembalikan semua perubahan untuk tabel atau mengubah informasi pelacakan untuk baris tertentu.

Konvensi sintaks transact-SQL

Sintaks

CHANGETABLE (  
    { CHANGES <table_name> , <last_sync_version> 
    | VERSION <table_name> , <primary_key_values> } 
    , [ FORCESEEK ] 
    )  
[AS] <table_alias> [ ( <column_alias> [ ,...n ] )  
  
<primary_key_values> ::=  
( <column_name> [ , ...n ] ) , ( <value> [ , ...n ] )  

Argumen

PERUBAHAN table_name , last_sync_version
Mengembalikan informasi pelacakan untuk semua perubahan pada tabel yang telah terjadi sejak versi yang ditentukan oleh last_sync_version.

table_name
Adalah tabel yang ditentukan pengguna untuk mendapatkan perubahan terlacak. Pelacakan perubahan harus diaktifkan pada tabel. Nama tabel satu, dua, tiga, atau empat bagian dapat digunakan. Nama tabel bisa menjadi sinonim ke tabel.

last_sync_version
Nilai skalar besar yang dapat diubah ke null. Ekspresi akan menyebabkan kesalahan sintaks. Jika nilainya ADALAH NULL, semua perubahan terlacak dikembalikan. Ketika mendapatkan perubahan, aplikasi panggilan harus menentukan titik dari mana perubahan diperlukan. last_sync_version menentukan titik tersebut. Fungsi mengembalikan informasi untuk semua baris yang telah diubah sejak versi tersebut. Aplikasi ini meminta untuk menerima perubahan dengan versi yang lebih besar dari last_sync_version. Biasanya, sebelum mendapatkan perubahan, aplikasi akan memanggil CHANGE_TRACKING_CURRENT_VERSION() untuk mendapatkan versi yang akan digunakan saat perubahan berikutnya diperlukan. Oleh karena itu, aplikasi tidak perlu menafsirkan atau memahami nilai aktual. Karena last_sync_version diperoleh oleh aplikasi panggilan, aplikasi harus mempertahankan nilainya. Jika aplikasi kehilangan nilai ini, maka aplikasi perlu menginisialisasi ulang data. last_sync_version harus divalidasi untuk memastikan bahwa informasi tersebut tidak terlalu lama, karena beberapa atau semua informasi perubahan mungkin telah dibersihkan sesuai dengan periode retensi yang dikonfigurasi untuk database. Untuk informasi selengkapnya, lihat opsi CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL) dan ALTER DATABASE SET (Transact-SQL).

VERSI table_name, { primary_key_values }
Mengembalikan informasi pelacakan perubahan terbaru untuk baris tertentu. Nilai kunci primer harus mengidentifikasi baris. primary_key_values mengidentifikasi kolom kunci utama dan menentukan nilai. Nama kolom kunci utama dapat ditentukan dalam urutan apa pun.

table_name
Adalah tabel yang ditentukan pengguna untuk mendapatkan informasi pelacakan perubahan. Pelacakan perubahan harus diaktifkan pada tabel. Nama tabel satu, dua, tiga, atau empat bagian dapat digunakan. Nama tabel bisa menjadi sinonim ke tabel.

column_name
Menentukan nama kolom atau kolom kunci utama. Beberapa nama kolom dapat ditentukan dalam urutan apa pun.

value
Adalah nilai kunci primer. Jika ada beberapa kolom kunci utama, nilai harus ditentukan dalam urutan yang sama dengan kolom yang muncul di daftar column_name .

[ FORCESEEK ]
Berlaku untuk: SQL Server (Dimulai dengan SQL Server 2016 (13.x) SP2 CU16, SQL Server 2017 (14.x) CU24, dan SQL Server 2019 (15.x) CU11), Azure SQL Database, dan Azure SQL Managed Instance

Parameter opsional yang memaksa operasi pencarian digunakan untuk mengakses table_name. Dalam beberapa kasus di mana sangat sedikit baris yang telah berubah, operasi pemindaian mungkin masih digunakan untuk mengakses table_name. Jika operasi pemindaian ini memperkenalkan masalah performa, gunakan FORCESEEK parameter .

[AS] table_alias [ (column_alias [ ,...n ] ) ]
Menyediakan nama untuk hasil yang dikembalikan oleh CHANGETABLE.

table_alias
Adalah nama alias tabel yang dikembalikan oleh CHANGETABLE. table_alias diperlukan dan harus menjadi pengidentifikasi yang valid.

column_alias
Adalah alias kolom opsional atau daftar alias kolom untuk kolom yang dikembalikan oleh CHANGETABLE. Ini memungkinkan nama kolom dikustomisasi jika ada nama duplikat dalam hasil.

Jenis Kembalian

tabel

Nilai yang Dikembalikan

PERUBAHAN YANG DAPAT DIUBAH

Saat PERUBAHAN ditentukan, nol atau beberapa baris yang memiliki kolom berikut dikembalikan.

Nama kolom Jenis data Deskripsi
SYS_CHANGE_VERSION bigint Nilai versi yang terkait dengan perubahan terakhir ke baris
SYS_CHANGE_CREATION_VERSION bigint Nilai versi yang terkait dengan operasi penyisipan terakhir.
SYS_CHANGE_OPERATION nchar(1) Menentukan jenis perubahan:

U = Perbarui

I = Sisipkan

D = Hapus
SYS_CHANGE_COLUMNS varbinary(4100) Mencantumkan kolom yang telah berubah sejak last_sync_version (garis besar). Perhatikan bahwa kolom komputasi tidak pernah tercantum sebagai diubah.

Nilainya adalah NULL ketika salah satu kondisi berikut ini benar:

Pelacakan perubahan kolom tidak diaktifkan.

Operasi ini adalah operasi sisipkan atau hapus.

Semua kolom kunci nonprimary diperbarui dalam satu operasi. Nilai biner ini tidak boleh ditafsirkan secara langsung. Sebagai gantinya, untuk menafsirkannya, gunakan CHANGE_TRACKING_IS_COLUMN_IN_MASK().
SYS_CHANGE_CONTEXT varbinary(128) Ubah informasi konteks yang dapat Anda tentukan secara opsional dengan menggunakan klausa WITH sebagai bagian dari pernyataan INSERT, UPDATE, atau DELETE.
<nilai kolom kunci primer> Sama seperti kolom tabel pengguna Nilai kunci utama untuk tabel terlacak. Nilai-nilai ini secara unik mengidentifikasi setiap baris dalam tabel pengguna.

VERSI CHANGETABLE

Saat VERSION ditentukan, satu baris yang memiliki kolom berikut dikembalikan.

Nama kolom Jenis data Deskripsi
SYS_CHANGE_VERSION bigint Nilai versi perubahan saat ini yang terkait dengan baris.

Nilainya adalah NULL jika perubahan belum dilakukan untuk jangka waktu yang lebih lama dari periode retensi pelacakan perubahan, atau baris belum diubah sejak pelacakan perubahan diaktifkan.
SYS_CHANGE_CONTEXT varbinary(128) Ubah informasi konteks yang dapat Anda tentukan secara opsional dengan menggunakan klausa WITH sebagai bagian dari pernyataan INSERT, UPDATE, atau DELETE.
<nilai kolom kunci primer> Sama seperti kolom tabel pengguna Nilai kunci utama untuk tabel terlacak. Nilai-nilai ini secara unik mengidentifikasi setiap baris dalam tabel pengguna.

Keterangan

Fungsi CHANGETABLE biasanya digunakan dalam klausa FROM kueri seolah-olah itu adalah tabel.

CHANGETABLE(CHANGE...)

Untuk mendapatkan data baris untuk baris baru atau yang dimodifikasi, gabungkan hasil yang diatur ke tabel pengguna dengan menggunakan kolom kunci utama. Hanya satu baris yang dikembalikan untuk setiap baris dalam tabel pengguna yang telah diubah, bahkan jika ada beberapa perubahan pada baris yang sama sejak nilai last_sync_version .

Perubahan kolom kunci primer tidak pernah ditandai sebagai pembaruan. Jika nilai kunci primer berubah, nilai tersebut dianggap sebagai penghapusan nilai lama dan sisipan nilai baru.

Jika Anda menghapus baris lalu menyisipkan baris yang memiliki kunci primer lama, perubahan tersebut akan dilihat sebagai pembaruan untuk semua kolom dalam baris.

Nilai yang dikembalikan untuk SYS_CHANGE_OPERATION kolom dan SYS_CHANGE_COLUMNS relatif terhadap garis besar (last_sync_version) yang ditentukan. Misalnya, jika operasi penyisipan dibuat pada versi 10 dan operasi pembaruan pada versi 15, dan jika garis besar last_sync_version adalah 12, pembaruan akan dilaporkan. Jika nilai last_sync_version adalah 8, sisipan akan dilaporkan. SYS_CHANGE_COLUMNS tidak akan pernah melaporkan kolom komputasi karena telah diperbarui.

Umumnya, semua operasi yang menyisipkan, memperbarui, atau menghapus data dalam tabel pengguna dilacak, termasuk pernyataan MERGE.

Operasi berikut yang memengaruhi data tabel pengguna tidak dilacak:

  • UPDATETEXT Menjalankan pernyataan. Pernyataan ini tidak digunakan lagi dan akan dihapus dalam versi SQL Server yang akan datang. Namun, perubahan yang dilakukan dengan menggunakan .WRITE klausul pernyataan UPDATE dilacak.

  • Menghapus baris dengan menggunakan TRUNCATE TABLE. Saat tabel dipotong, informasi versi pelacakan perubahan yang terkait dengan tabel diatur ulang seolah-olah pelacakan perubahan baru saja diaktifkan pada tabel. Aplikasi klien harus selalu memvalidasi versi terakhirnya yang disinkronkan. Validasi gagal jika tabel telah dipotong.

CHANGETABLE(VERSION...)

Tataan hasil kosong dikembalikan jika kunci primer yang tidak ada ditentukan.

Nilai mungkin NULL jika perubahan belum dilakukan lebih lama dari periode retensi (misalnya, pembersihan SYS_CHANGE_VERSION telah menghapus informasi perubahan) atau baris belum pernah diubah sejak pelacakan perubahan diaktifkan untuk tabel.

Izin

SELECT Memerlukan izin pada kolom kunci utama dan VIEW CHANGE TRACKING izin pada tabel yang ditentukan oleh <nilai table_name> untuk mendapatkan informasi pelacakan perubahan.

Contoh

J. Mengembalikan baris untuk sinkronisasi awal data

Contoh berikut menunjukkan cara mendapatkan data untuk sinkronisasi awal data tabel. Kueri mengembalikan semua data baris dan versi terkaitnya. Anda kemudian dapat menyisipkan atau menambahkan data ini ke sistem yang akan berisi data yang disinkronkan.

-- Get all current rows with associated version  
SELECT e.[Emp ID], e.SSN, e.FirstName, e.LastName,  
    c.SYS_CHANGE_VERSION, c.SYS_CHANGE_CONTEXT  
FROM Employees AS e  
CROSS APPLY CHANGETABLE   
    (VERSION Employees, ([Emp ID], SSN), (e.[Emp ID], e.SSN)) AS c;  

B. Mencantumkan semua perubahan yang dibuat sejak versi tertentu

Contoh berikut mencantumkan semua perubahan yang dibuat dalam tabel sejak versi yang ditentukan (@last_sync_version). [Emp ID] dan SSN adalah kolom dalam kunci primer komposit.

DECLARE @last_sync_version bigint;  
SET @last_sync_version = <value obtained from query>;  
SELECT [Emp ID], SSN,  
    SYS_CHANGE_VERSION, SYS_CHANGE_OPERATION,  
    SYS_CHANGE_COLUMNS, SYS_CHANGE_CONTEXT   
FROM CHANGETABLE (CHANGES Employees, @last_sync_version) AS C;  

C. Mendapatkan semua data yang diubah untuk sinkronisasi

Contoh berikut menunjukkan bagaimana Anda bisa mendapatkan semua data yang telah berubah. Kueri ini menggabungkan informasi pelacakan perubahan dengan tabel pengguna sehingga informasi tabel pengguna dikembalikan. LEFT OUTER JOIN digunakan sehingga baris dikembalikan untuk baris yang dihapus.

-- Get all changes (inserts, updates, deletes)  
DECLARE @last_sync_version bigint;  
SET @last_sync_version = <value obtained from query>;  
SELECT e.FirstName, e.LastName, c.[Emp ID], c.SSN,  
    c.SYS_CHANGE_VERSION, c.SYS_CHANGE_OPERATION,  
    c.SYS_CHANGE_COLUMNS, c.SYS_CHANGE_CONTEXT   
FROM CHANGETABLE (CHANGES Employees, @last_sync_version) AS c  
    LEFT OUTER JOIN Employees AS e  
        ON e.[Emp ID] = c.[Emp ID] AND e.SSN = c.SSN;  

D. Mendeteksi konflik dengan menggunakan CHANGETABLE(VERSION...)

Contoh berikut menunjukkan cara memperbarui baris hanya jika baris tidak berubah sejak sinkronisasi terakhir. Nomor versi baris tertentu diperoleh dengan menggunakan CHANGETABLE. Jika baris telah diperbarui, perubahan tidak dibuat dan kueri mengembalikan informasi tentang perubahan terbaru ke baris.

-- @last_sync_version must be set to a valid value  
UPDATE  
    SalesLT.Product  
SET  
    ListPrice = @new_listprice  
FROM  
    SalesLT.Product AS P  
WHERE  
    ProductID = @product_id AND  
    @last_sync_version >= ISNULL (  
        (SELECT CT.SYS_CHANGE_VERSION FROM   
            CHANGETABLE(VERSION SalesLT.Product,  
            (ProductID), (P.ProductID)) AS CT),  
        0);  

Lihat Juga

Fungsi Pelacakan Perubahan (Transact-SQL)
Lacak Perubahan Data (SQL Server)
CHANGE_TRACKING_IS_COLUMN_IN_MASK (T-SQL)
CHANGE_TRACKING_CURRENT_VERSION (T-SQL)
CHANGE_TRACKING_MIN_VALID_VERSION (T-SQL)