<cdc.fn_cdc_get_net_changes_capture_instance> (T-SQL)

Berlaku untuk:SQL Server

Mengembalikan satu baris perubahan bersih untuk setiap baris sumber yang diubah dalam rentang Nomor Urutan Log (LSN) yang ditentukan.

Tunggu, apa itu LSN? Setiap rekaman dalam log transaksi SQL Server diidentifikasi secara unik oleh nomor urutan log (LSN). LSN diurutkan sedih sehingga jika LSN2 lebih besar dari LSN1, perubahan yang dijelaskan oleh catatan log yang dirujuk oleh LSN2 terjadi setelah perubahan yang dijelaskan oleh LSN catatan log.

LSN rekaman log tempat peristiwa signifikan terjadi dapat berguna untuk membangun urutan pemulihan yang benar. Karena LSN diurutkan, Anda dapat membandingkannya dengan kesetaraan dan ketidaksetaraan (yaitu, <, , >=, <=, >=). Perbandingan tersebut berguna saat membuat urutan pemulihan.

Saat baris sumber memiliki beberapa perubahan selama rentang LSN, satu baris yang mencerminkan konten akhir baris dikembalikan oleh fungsi enumerasi yang dijelaskan di bawah ini. Misalnya, jika transaksi menyisipkan baris dalam tabel sumber dan transaksi berikutnya dalam rentang LSN memperbarui satu atau beberapa kolom dalam baris tersebut, fungsi hanya mengembalikan satu baris, yang mencakup nilai kolom yang diperbarui.

Fungsi enumerasi ini dibuat ketika tabel sumber diaktifkan untuk mengubah tangkapan data dan pelacakan bersih ditentukan. Untuk mengaktifkan pelacakan bersih, tabel sumber harus memiliki kunci primer atau indeks unik. Nama fungsi diturunkan dan menggunakan format cdc.fn_cdc_get_net_changes_<capture_instance>, di mana <capture_instance> adalah nilai yang ditentukan untuk instans pengambilan saat tabel sumber diaktifkan untuk mengubah pengambilan data. Untuk informasi selengkapnya, lihat sys.sp_cdc_enable_table (Transact-SQL).

Konvensi sintaks transact-SQL

Sintaks

  
cdc.fn_cdc_get_net_changes_capture_instance ( from_lsn , to_lsn , '<row_filter_option>' )  
  
<row_filter_option> ::=  
{ all  
 | all with mask  
 | all with merge  
}  

Argumen

from_lsn

LSN yang mewakili titik akhir rendah rentang LSN untuk disertakan dalam tataan hasil. from_lsn adalah biner(10).

Hanya baris di cdc.[ capture_instance]_CT mengubah tabel dengan nilai dalam __$start_lsn lebih besar dari atau sama dengan from_lsn disertakan dalam tataan hasil.

to_lsn

LSN yang mewakili titik akhir tinggi rentang LSN untuk disertakan dalam tataan hasil. to_lsn adalah biner(10).

Hanya baris di cdc.[ capture_instance]_CT mengubah tabel dengan nilai dalam __$start_lsn kurang dari atau sama dengan from_lsn atau sama dengan to_lsn disertakan dalam tataan hasil.

<> row_filter_option ::= { all | all with mask | all with merge }

Opsi yang mengatur konten kolom metadata serta baris yang dikembalikan dalam tataan hasil. Bisa menjadi salah satu opsi berikut:

all
Mengembalikan LSN dari perubahan akhir ke baris dan operasi yang diperlukan untuk menerapkan baris dalam kolom metadata __$start_lsn dan operasi __$. Kolom __$update_mask selalu NULL.

semua dengan masker
Mengembalikan LSN dari perubahan akhir ke baris dan operasi yang diperlukan untuk menerapkan baris dalam kolom metadata __$start_lsn dan operasi __$. Selain itu, ketika operasi pembaruan mengembalikan (__$operation = 4) kolom yang diambil yang dimodifikasi dalam pembaruan ditandai dalam nilai yang dikembalikan dalam __$update_mask.

semua dengan penggabungan
Mengembalikan LSN dari perubahan akhir ke baris dalam kolom metadata __$start_lsn. Operasi kolom __$akan menjadi salah satu dari dua nilai: 1 untuk penghapusan dan 5 untuk menunjukkan bahwa operasi yang diperlukan untuk menerapkan perubahan adalah sisipan atau pembaruan. Kolom __$update_mask selalu NULL.

Karena logika untuk menentukan operasi yang tepat untuk perubahan tertentu menambah kompleksitas kueri, opsi ini dirancang untuk meningkatkan performa kueri ketika cukup untuk menunjukkan bahwa operasi yang diperlukan untuk menerapkan data perubahan adalah sisipan atau pembaruan, tetapi tidak perlu membedakan secara eksplisit antara keduanya. Opsi ini paling menarik di lingkungan target tempat operasi penggabungan tersedia secara langsung.

Tabel dikembalikan

Nama kolom Jenis data Deskripsi
__$start_lsn biner(10) LSN yang terkait dengan transaksi penerapan untuk perubahan tersebut.

Semua perubahan yang dilakukan dalam transaksi yang sama berbagi LSN penerapan yang sama. Misalnya, jika operasi pembaruan pada tabel sumber memodifikasi dua kolom dalam dua baris, tabel perubahan akan berisi empat baris, masing-masing dengan __$start_lsnvalue yang sama.
Operasi __$ int Mengidentifikasi operasi bahasa manipulasi data (DML) yang diperlukan untuk menerapkan baris data perubahan ke sumber data target.

Jika nilai parameter row_filter_option adalah semua atau semua dengan masker, nilai dalam kolom ini bisa menjadi salah satu nilai berikut:

1 = hapus

2 = sisipkan

4 = pembaruan

Jika nilai parameter row_filter_option semuanya dengan penggabungan, nilai dalam kolom ini bisa menjadi salah satu nilai berikut:

1 = hapus

5 = sisipkan atau perbarui
__$update_mask varbinary(128) Masker bit dengan sedikit yang sesuai dengan setiap kolom yang ditangkap yang diidentifikasi untuk instans pengambilan. Nilai ini memiliki semua bit yang ditentukan yang diatur ke 1 ketika __$operation = 1 atau 2. Ketika __$operation = 3 atau 4, hanya bit yang sesuai dengan kolom yang diubah yang diatur ke 1.
<kolom tabel sumber yang diambil> Bervariasi Kolom yang tersisa yang dikembalikan oleh fungsi adalah kolom dari tabel sumber yang diidentifikasi sebagai kolom yang diambil saat instans pengambilan dibuat. Jika tidak ada kolom yang ditentukan dalam daftar kolom yang diambil, semua kolom dalam tabel sumber dikembalikan.

Izin

Memerlukan keanggotaan dalam peran server tetap sysadmin atau peran database tetap db_owner. Untuk semua pengguna lain, memerlukan izin SELECT pada semua kolom yang diambil dalam tabel sumber dan, jika peran pembatasan untuk instans pengambilan ditentukan, keanggotaan dalam peran database tersebut. Ketika pemanggil tidak memiliki izin untuk melihat data sumber, fungsi mengembalikan baris dengan nilai NULL untuk semua kolom.

Keterangan

Modifikasi pada pengidentifikasi unik baris akan menyebabkan fn_cdc_get_net_changes menampilkan perintah UPDATE awal dengan perintah DELETE dan kemudian INSERT sebagai gantinya. Perilaku ini diperlukan untuk melacak kunci baik sebelum dan sesudah perubahan.

Kesalahan 313 diharapkan jika rentang LSN yang disediakan tidak sesuai saat memanggil cdc.fn_cdc_get_all_changes_<capture_instance> atau cdc.fn_cdc_get_net_changes_<capture_instance>. lsn_value Jika parameter berada di luar waktu LSN terendah atau LSN tertinggi, maka eksekusi fungsi-fungsi ini akan kembali dalam kesalahan 313: Msg 313, Level 16, State 3, Line 1 An insufficient number of arguments were supplied for the procedure or function. Kesalahan ini harus ditangani oleh pengembang. Sampel T-SQL untuk solusi dapat ditemukan di ReplTalk di GitHub.

Contoh

Contoh berikut menggunakan fungsi cdc.fn_cdc_get_net_changes_HR_Department untuk melaporkan perubahan bersih yang dibuat pada tabel HumanResources.Department sumber selama interval waktu tertentu.

Pertama, GETDATE fungsi digunakan untuk menandai awal interval waktu. Setelah beberapa pernyataan DML diterapkan ke tabel sumber, fungsi dipanggil GETDATE lagi untuk mengidentifikasi akhir interval waktu. Fungsi sys.fn_cdc_map_time_to_lsn kemudian digunakan untuk memetakan interval waktu ke rentang kueri penangkapan data perubahan yang dibatasi oleh nilai LSN. Terakhir, fungsi cdc.fn_cdc_get_net_changes_HR_Department dikueri untuk mendapatkan perubahan bersih pada tabel sumber untuk interval waktu. Perhatikan bahwa baris yang disisipkan lalu dihapus tidak muncul dalam tataan hasil yang dikembalikan oleh fungsi . Ini karena baris yang pertama kali ditambahkan lalu dihapus dalam jendela kueri tidak menghasilkan perubahan bersih pada tabel sumber untuk interval.

Catatan

Sebelum menjalankan contoh ini, Anda harus terlebih dahulu menjalankan contoh B di sys.sp_cdc_enable_table (Transact-SQL) untuk mengaktifkan CDC pada tabel HumanResources.Department. Dalam contoh di bawah ini, HR_Department adalah nama instans pengambilan CDC, seperti yang ditentukan dalam sys.sp_cdc_enable_table.

USE AdventureWorks2022;  
GO  
DECLARE @begin_time datetime, @end_time datetime, @from_lsn binary(10), @to_lsn binary(10);  
-- Obtain the beginning of the time interval.  
SET @begin_time = DATEADD(day, -1, GETDATE()) ;  
-- DML statements to produce changes in the HumanResources.Department table.  
INSERT INTO HumanResources.Department (Name, GroupName)  
VALUES (N'MyDept', N'MyNewGroup');  
  
UPDATE HumanResources.Department  
SET GroupName = N'Resource Control'  
WHERE GroupName = N'Inventory Management';  
  
DELETE FROM HumanResources.Department  
WHERE Name = N'MyDept';  
  
-- Obtain the end of the time interval.  
SET @end_time = GETDATE();  
-- Map the time interval to a change data capture query range.  
SET @from_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time);  
SET @from_lsn = ISNULL(sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time), [sys].[fn_cdc_get_min_lsn]('HR_Department') );
SET @to_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal', @end_time);  
  
-- Return the net changes occurring within the query window.  
SELECT * FROM cdc.fn_cdc_get_net_changes_HR_Department(@from_lsn, @to_lsn, 'all');  

Lihat Juga